AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
Unit Class Referenceabstract

#include "Unit.h"

Inheritance diagram for Unit:
WorldObject Object WorldLocation Position Creature Player TempSummon Minion Guardian Puppet Totem Pet

Public Types

typedef std::unordered_set< Unit * > AttackerSet
 
typedef std::set< Unit * > ControlSet
 
typedef std::multimap< uint32, Aura * > AuraMap
 
typedef std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
 
typedef std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
 
typedef std::multimap< uint32, AuraApplication * > AuraApplicationMap
 
typedef std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
 
typedef std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
 
typedef std::multimap< AuraStateType, AuraApplication * > AuraStateAurasMap
 
typedef std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
 
typedef std::vector< AuraEffect * > AuraEffectList
 
typedef std::list< Aura * > AuraList
 
typedef std::list< AuraApplication * > AuraApplicationList
 
typedef std::list< DiminishingReturnDiminishing
 
typedef GuidUnorderedSet ComboPointHolderSet
 
typedef std::map< uint8, AuraApplication * > VisibleAuraMap
 
typedef std::set< PetAura const * > PetAuraSet
 

Public Member Functions

 ~Unit () override
 
void Update (uint32 time) override
 
UnitAIGetAI ()
 
void SetAI (UnitAI *newAI)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void CleanupBeforeRemoveFromMap (bool finalCleanup)
 
void CleanupsBeforeDelete (bool finalCleanup=true) override
 
virtual bool isBeingLoaded () const
 
bool IsDuringRemoveFromWorld () const
 
void SetUInt32Value (uint16 index, uint32 value)
 
UnitGetOwner () const
 
ObjectGuid GetOwnerGUID () const
 
void SetOwnerGUID (ObjectGuid owner)
 
ObjectGuid GetCreatorGUID () const
 
void SetCreatorGUID (ObjectGuid creator)
 
ObjectGuid GetMinionGUID () const
 
void SetMinionGUID (ObjectGuid guid)
 
ObjectGuid GetCharmerGUID () const
 
void SetCharmerGUID (ObjectGuid owner)
 
ObjectGuid GetCharmGUID () const
 
void SetPetGUID (ObjectGuid guid)
 
ObjectGuid GetPetGUID () const
 
void SetCritterGUID (ObjectGuid guid)
 
ObjectGuid GetCritterGUID () const
 
ObjectGuid GetTransGUID () const override
 
PetToPet ()
 
TotemToTotem ()
 
TempSummonToTempSummon ()
 
const TempSummonToTempSummon () const
 
void AddUnitState (uint32 f)
 
bool HasUnitState (const uint32 f) const
 
void ClearUnitState (uint32 f)
 
uint32 GetUnitState () const
 
uint32 HasUnitTypeMask (uint32 mask) const
 
void AddUnitTypeMask (uint32 mask)
 
uint32 GetUnitTypeMask () const
 
UnitFlags GetUnitFlags () const
 
bool HasUnitFlag (UnitFlags flags) const
 
void SetUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void RemoveUnitFlag (UnitFlags flags)
 UnitFlags available in UnitDefines.h.
 
void ReplaceAllUnitFlags (UnitFlags flags)
 Remove the Unit flag specify only.
 
UnitFlags2 GetUnitFlags2 () const
 Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.
 
bool HasUnitFlag2 (UnitFlags2 flags) const
 
void SetUnitFlag2 (UnitFlags2 flags)
 
void RemoveUnitFlag2 (UnitFlags2 flags)
 
void ReplaceAllUnitFlags2 (UnitFlags2 flags)
 
void SetEmoteState (Emote emoteState)
 
void ClearEmoteState ()
 Sets emote state (looping emote). Emotes available in SharedDefines.h.
 
NPCFlags GetNpcFlags () const
 Clears emote state (looping emote)
 
bool HasNpcFlag (NPCFlags flags) const
 
void SetNpcFlag (NPCFlags flags)
 
void RemoveNpcFlag (NPCFlags flags)
 
void ReplaceAllNpcFlags (NPCFlags flags)
 
uint32 GetDynamicFlags () const override
 
void ReplaceAllDynamicFlags (uint32 flag) override
 
void AddUnitMovementFlag (uint32 f)
 
void RemoveUnitMovementFlag (uint32 f)
 
bool HasUnitMovementFlag (uint32 f) const
 
uint32 GetUnitMovementFlags () const
 
void SetUnitMovementFlags (uint32 f)
 
void AddExtraUnitMovementFlag (uint16 f)
 
void RemoveExtraUnitMovementFlag (uint16 f)
 
uint16 HasExtraUnitMovementFlag (uint16 f) const
 
uint16 GetExtraUnitMovementFlags () const
 
void SetExtraUnitMovementFlags (uint16 f)
 
bool IsSummon () const
 
bool IsGuardian () const
 
bool IsControllableGuardian () const
 
bool IsPet () const
 
bool IsHunterPet () const
 
bool IsTotem () const
 
bool IsVehicle () const
 
bool IsVendor () const
 
bool IsTrainer () const
 
bool IsQuestGiver () const
 
bool IsGossip () const
 
bool IsTaxi () const
 
bool IsGuildMaster () const
 
bool IsBattleMaster () const
 
bool IsBanker () const
 
bool IsInnkeeper () const
 
bool IsSpiritHealer () const
 
bool IsSpiritGuide () const
 
bool IsTabardDesigner () const
 
bool IsAuctioner () const
 
bool IsArmorer () const
 
bool IsServiceProvider () const
 
bool IsSpiritService () const
 
uint32 GetCreatureType () const
 
uint32 GetCreatureTypeMask () const
 
bool IsCritter () const
 
uint8 getRace (bool original=false) const
 
void setRace (uint8 race)
 
uint32 getRaceMask () const
 
DisplayRace GetDisplayRaceFromModelId (uint32 modelId) const
 
DisplayRace GetDisplayRace () const
 
uint8 getClass () const
 
virtual bool IsClass (Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
 
uint32 getClassMask () const
 
uint8 getGender () const
 
uint32 GetFaction () const
 
FactionTemplateEntry const * GetFactionTemplateEntry () const
 
void SetFaction (uint32 faction)
 
void RestoreFaction ()
 
uint32 GetOldFactionId () const
 
ObjectGuid GetTarget () const
 
virtual void SetTarget (ObjectGuid=ObjectGuid::Empty)=0
 
bool isTargetableForAttack (bool checkFakeDeath=true, Unit const *byWho=nullptr) const
 
bool IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell=nullptr) const
 
bool _IsValidAttackTarget (Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
 
bool IsValidAssistTarget (Unit const *target) const
 
bool _IsValidAssistTarget (Unit const *target, SpellInfo const *bySpell) const
 
float GetBoundaryRadius () const
 
float GetCombatReach () const override
 
float GetMeleeReach () const
 
bool IsWithinRange (Unit const *obj, float dist) const
 
bool IsWithinBoundaryRadius (const Unit *obj) const
 
bool IsWithinCombatRange (Unit const *obj, float dist2compare) const
 
bool IsWithinMeleeRange (Unit const *obj, float dist=0.f) const
 
float GetMeleeRange (Unit const *target) const
 
void setAttackTimer (WeaponAttackType type, int32 time)
 
void resetAttackTimer (WeaponAttackType type=BASE_ATTACK)
 
int32 getAttackTimer (WeaponAttackType type) const
 
bool isAttackReady (WeaponAttackType type=BASE_ATTACK) const
 
virtual SpellSchoolMask GetMeleeDamageSchoolMask (WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
 
bool GetRandomContactPoint (Unit const *target, float &x, float &y, float &z, bool force=false) const
 
UnitgetAttackerForHelper () const
 
bool Attack (Unit *victim, bool meleeAttack)
 
void CastStop (uint32 except_spellid=0, bool withInstant=true)
 Interrupt the unit cast for all the current spells.
 
bool AttackStop ()
 Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.
 
void RemoveAllAttackers ()
 Remove all units in m_attackers list and send them AttackStop()
 
AttackerSet const & getAttackers () const
 
bool GetMeleeAttackPoint (Unit *attacker, Position &pos)
 
bool isAttackingPlayer () const
 
UnitGetVictim () const
 
void CombatStop (bool includingCast=false)
 
void CombatStopWithPets (bool includingCast=false)
 
void StopAttackFaction (uint32 faction_id)
 
void StopAttackingInvalidTarget ()
 
UnitSelectNearbyTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
UnitSelectNearbyNoTotemTarget (Unit *exclude=nullptr, float dist=NOMINAL_MELEE_RANGE) const
 
void SendMeleeAttackStop (Unit *victim=nullptr)
 Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.
 
void SendMeleeAttackStart (Unit *victim, Player *sendTo=nullptr)
 
uint32 GetAttackTime (WeaponAttackType att) const
 
void SetAttackTime (WeaponAttackType att, uint32 val)
 
void ApplyAttackTimePercentMod (WeaponAttackType att, float val, bool apply)
 
void ApplyCastTimePercentMod (float val, bool apply)
 
void SetImmuneToAll (bool apply, bool keepCombat=false)
 
bool IsImmuneToAll () const
 
void SetImmuneToPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToPC () const
 
void SetImmuneToNPC (bool apply, bool keepCombat=false)
 
bool IsImmuneToNPC () const
 
bool IsEngaged () const
 
bool IsEngagedBy (Unit const *who) const
 
bool IsInCombat () const
 
bool IsInCombatWith (Unit const *who) const
 
bool IsPetInCombat () const
 
void CombatStart (Unit *target, bool initialAggro=true)
 
void CombatStartOnCast (Unit *target, bool initialAggro=true, uint32 duration=0)
 
void SetInCombatState (bool PvP, Unit *enemy=nullptr, uint32 duration=0)
 
void SetInCombatWith (Unit *enemy, uint32 duration=0)
 
void ClearInCombat ()
 
void ClearInPetCombat ()
 
uint32 GetCombatTimer () const
 
void SetCombatTimer (uint32 timer)
 
bool CanHaveThreatList (bool skipAliveCheck=false) const
 
void AddThreat (Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
 
float ApplyTotalThreatModifier (float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
void TauntApply (Unit *victim)
 
void TauntFadeOut (Unit *taunter)
 
ThreatMgrGetThreatMgr ()
 
ThreatMgr const & GetThreatMgr () const
 
void addHatedBy (HostileReference *pHostileReference)
 
void removeHatedBy (HostileReference *)
 
HostileRefMgrgetHostileRefMgr ()
 
void SetRedirectThreat (ObjectGuid guid, uint32 pct)
 
void ResetRedirectThreat ()
 
void ModifyRedirectThreat (int32 amount)
 
uint32 GetRedirectThreatPercent ()
 
UnitGetRedirectThreatTarget () const
 
void SetLastDamagedTargetGuid (ObjectGuid const &guid)
 
ObjectGuid const & GetLastDamagedTargetGuid () const
 
void AttackerStateUpdate (Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
 
bool haveOffhandWeapon () const
 
bool CanDualWield () const
 
virtual void SetCanDualWield (bool value)
 
virtual bool HasWeapon (WeaponAttackType type) const =0
 
bool HasMainhandWeapon () const
 
bool HasOffhandWeapon () const
 
bool HasRangedWeapon () const
 
bool hasMainhandWeaponForAttack () const
 
virtual bool HasWeaponForAttack (WeaponAttackType type) const
 
bool HasMainhandWeaponForAttack () const
 
bool HasOffhandWeaponForAttack () const
 
bool HasRangedWeaponForAttack () const
 
bool CanUseAttackType (uint8 attacktype) const
 
void HandleProcExtraAttackFor (Unit *victim, uint32 count)
 
void SetLastExtraAttackSpell (uint32 spellId)
 
uint32 GetLastExtraAttackSpell () const
 
void AddExtraAttacks (uint32 count)
 
uint8 GetComboPoints (Unit const *who=nullptr) const
 
uint8 GetComboPoints (ObjectGuid const &guid) const
 
UnitGetComboTarget () const
 
ObjectGuid const GetComboTargetGUID () const
 
void AddComboPoints (Unit *target, int8 count)
 
void AddComboPoints (int8 count)
 
void ClearComboPoints ()
 
void AddComboPointHolder (Unit *unit)
 
void RemoveComboPointHolder (Unit *unit)
 
void ClearComboPointHolders ()
 
void SetContestedPvP (Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
 
bool IsContestedGuard () const
 
bool RespondsToCallForHelp () const
 
bool IsInSanctuary () const
 
bool IsPvP () const
 
bool IsFFAPvP () const
 
void SetPvP (bool state)
 
float GetStat (Stats stat) const
 
void SetStat (Stats stat, int32 val)
 
Stats GetStatByAuraGroup (UnitMods unitMod) const
 
float GetCreateStat (Stats stat) const
 
void SetCreateStat (Stats stat, float val)
 
float GetPosStat (Stats stat) const
 
float GetNegStat (Stats stat) const
 
void InitStatBuffMods ()
 
bool HandleStatModifier (UnitMods unitMod, UnitModifierType modifierType, float amount, bool apply)
 
void SetModifierValue (UnitMods unitMod, UnitModifierType modifierType, float value)
 
float GetModifierValue (UnitMods unitMod, UnitModifierType modifierType) const
 
float GetTotalStatValue (Stats stat, float additionalValue=0.0f) const
 
void SetCanModifyStats (bool modifyStats)
 
bool CanModifyStats () const
 
void ApplyStatBuffMod (Stats stat, float val, bool apply)
 
void ApplyStatPercentBuffMod (Stats stat, float val, bool apply)
 
uint8 GetLevel () const
 
uint8 getLevelForTarget (WorldObject const *) const override
 
void SetLevel (uint8 lvl, bool showLevelChange=true)
 
uint32 GetHealth () const
 
uint32 GetMaxHealth () const
 
float GetHealthPct () const
 
int32 GetHealthGain (int32 dVal)
 
uint32 GetCreateHealth () const
 
bool IsFullHealth () const
 
bool HealthBelowPct (int32 pct) const
 
bool HealthBelowPctDamaged (int32 pct, uint32 damage) const
 
bool HealthAbovePct (int32 pct) const
 
bool HealthAbovePctHealed (int32 pct, uint32 heal) const
 
uint32 CountPctFromMaxHealth (int32 pct) const
 
uint32 CountPctFromCurHealth (int32 pct) const
 
void SetHealth (uint32 val)
 
void SetMaxHealth (uint32 val)
 
void SetFullHealth ()
 
int32 ModifyHealth (int32 val)
 
void SetCreateHealth (uint32 val)
 
Powers getPowerType () const
 
virtual bool HasActivePowerType (Powers power)
 
Powers GetPowerTypeByAuraGroup (UnitMods unitMod) const
 
uint32 GetPower (Powers power) const
 
uint32 GetMaxPower (Powers power) const
 
float GetPowerPct (Powers power) const
 
uint32 GetCreatePowers (Powers power) const
 
void setPowerType (Powers power)
 
void SetPower (Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
 
void SetMaxPower (Powers power, uint32 val)
 
int32 ModifyPower (Powers power, int32 val, bool withPowerUpdate=true)
 
int32 ModifyPowerPct (Powers power, float pct, bool apply=true)
 
void RewardRage (uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
 
uint32 GetCreateMana () const
 
void SetCreateMana (uint32 val)
 
bool CanRestoreMana (SpellInfo const *spellInfo) const
 
void SetLastManaUse (uint32 spellCastTime)
 
bool IsUnderLastManaUseEffect () const
 
float GetAPMultiplier (WeaponAttackType attType, bool normalized)
 
uint32 GetArmor () const
 
void SetArmor (int32 val)
 
float GetUnitDodgeChance () const
 
float GetUnitParryChance () const
 
float GetUnitBlockChance () const
 
float GetUnitMissChance (WeaponAttackType attType) const
 
float GetUnitCriticalChance (WeaponAttackType attackType, Unit const *victim) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType) const
 
MeleeHitOutcome RollMeleeOutcomeAgainst (Unit const *victim, WeaponAttackType attType, int32 crit_chance, int32 miss_chance, int32 dodge_chance, int32 parry_chance, int32 block_chance) const
 
bool CanApplyResilience () const
 
virtual uint32 GetShieldBlockValue () const =0
 
uint32 GetShieldBlockValue (uint32 soft_cap, uint32 hard_cap) const
 
uint32 GetUnitMeleeSkill (Unit const *target=nullptr) const
 
uint32 GetDefenseSkillValue (Unit const *target=nullptr) const
 
uint32 GetWeaponSkillValue (WeaponAttackType attType, Unit const *target=nullptr) const
 
int32 GetMechanicResistChance (SpellInfo const *spell)
 
uint32 GetResistance (SpellSchoolMask mask) const
 
uint32 GetResistance (SpellSchools school) const
 
float GetResistanceBuffMods (SpellSchools school, bool positive) const
 
void SetResistance (SpellSchools school, int32 val)
 
void SetResistanceBuffMods (SpellSchools school, bool positive, float val)
 
void ApplyResistanceBuffModsMod (SpellSchools school, bool positive, float val, bool apply)
 
void ApplyResistanceBuffModsPercentMod (SpellSchools school, bool positive, float val, bool apply)
 
uint16 GetMaxSkillValueForLevel (Unit const *target=nullptr) const
 
float GetTotalAuraModValue (UnitMods unitMod) const
 
SpellSchools GetSpellSchoolByAuraGroup (UnitMods unitMod) const
 
float GetTotalAttackPowerValue (WeaponAttackType attType, Unit *pVictim=nullptr) const
 
float GetWeaponDamageRange (WeaponAttackType attType, WeaponDamageRange type, uint8 damageIndex=0) const
 
void SetBaseWeaponDamage (WeaponAttackType attType, WeaponDamageRange damageRange, float value, uint8 damageIndex=0)
 
virtual bool UpdateStats (Stats stat)=0
 
virtual bool UpdateAllStats ()=0
 
virtual void UpdateResistances (uint32 school)=0
 
virtual void UpdateAllResistances ()
 
virtual void UpdateArmor ()=0
 
virtual void UpdateMaxHealth ()=0
 
virtual void UpdateMaxPower (Powers power)=0
 
virtual void UpdateAttackPowerAndDamage (bool ranged=false)=0
 
virtual void UpdateDamagePhysical (WeaponAttackType attType)
 
void DealMeleeDamage (CalcDamageInfo *damageInfo, bool durabilityLoss)
 
void DealSpellDamage (SpellNonMeleeDamage *damageInfo, bool durabilityLoss, Spell const *spell=nullptr)
 
void KillSelf (bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
uint32 CalculateDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
 
virtual void CalculateMinMaxDamage (WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0
 
void CalculateMeleeDamage (Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
 
void CalculateSpellDamageTaken (SpellNonMeleeDamage *damageInfo, int32 damage, SpellInfo const *spellInfo, WeaponAttackType attackType=BASE_ATTACK, bool crit=false)
 
int32 CalculateSpellDamage (Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
 
float CalculateDefaultCoefficient (SpellInfo const *spellInfo, DamageEffectType damagetype) const
 
uint32 MeleeDamageBonusDone (Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
uint32 MeleeDamageBonusTaken (Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
 
int32 SpellBaseDamageBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseDamageBonusTaken (SpellSchoolMask schoolMask, bool isDoT=false)
 
float SpellPctDamageModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellDamageBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellDamageBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
 
int32 CalculateAOEDamageReduction (int32 damage, uint32 schoolMask, bool npcCaster) const
 
uint32 GetMeleeDamageReduction (uint32 damage) const
 
uint32 GetRangedDamageReduction (uint32 damage) const
 
uint32 GetSpellDamageReduction (uint32 damage) const
 
float GetMeleeCritChanceReduction () const
 
float GetRangedCritChanceReduction () const
 
float GetSpellCritChanceReduction () const
 
uint32 GetMeleeCritDamageReduction (uint32 damage) const
 
uint32 GetRangedCritDamageReduction (uint32 damage) const
 
uint32 GetSpellCritDamageReduction (uint32 damage) const
 
CharmInfoGetCharmInfo ()
 
CharmInfoInitCharmInfo ()
 
UnitGetCharmer () const
 
UnitGetCharm () const
 
UnitGetCharmerOrOwner () const
 
UnitGetCharmerOrOwnerOrSelf () const
 
PlayerGetCharmerOrOwnerPlayerOrPlayerItself () const
 
ObjectGuid GetCharmerOrOwnerGUID () const
 
ObjectGuid GetCharmerOrOwnerOrOwnGUID () const
 
PlayerGetAffectingPlayer () const
 
UnitGetFirstControlled () const
 
bool IsControlledByPlayer () const
 
bool IsCreatedByPlayer () const
 
bool IsCharmedOwnedByPlayerOrPlayer () const
 
bool IsCharmed () const
 
bool isPossessed () const
 
bool isPossessedByPlayer () const
 
bool isPossessing () const
 
bool isPossessing (Unit *u) const
 
void SetCharm (Unit *target, bool apply)
 
bool SetCharmedBy (Unit *charmer, CharmType type, AuraApplication const *aurApp=nullptr)
 
void UpdateCharmAI ()
 
void RemoveCharmedBy (Unit *charmer)
 
void RemoveCharmAuras ()
 
void RemoveAllControlled (bool onDeath=false)
 
void DeleteCharmInfo ()
 
virtual bool HasSpellCooldown (uint32) const
 
virtual bool HasSpellItemCooldown (uint32, uint32) const
 
virtual void AddSpellCooldown (uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, uint32 spellId, uint32 cooldown)
 
void BuildCooldownPacket (WorldPacket &data, uint8 flags, PacketCooldowns const &cooldowns)
 
AuraAddAura (uint32 spellId, Unit *target)
 
AuraAddAura (SpellInfo const *spellInfo, uint8 effMask, Unit *target)
 
void SetAuraStack (uint32 spellId, Unit *target, uint32 stack)
 
Aura_TryStackingOrRefreshingExistingAura (SpellInfo const *newAura, uint8 effMask, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool periodicReset=false)
 
void _AddAura (UnitAura *aura, Unit *caster)
 
AuraApplication_CreateAuraApplication (Aura *aura, uint8 effMask)
 
void _ApplyAuraEffect (Aura *aura, uint8 effIndex)
 
void _ApplyAura (AuraApplication *aurApp, uint8 effMask)
 
void _UnapplyAura (AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
 
void _UnapplyAura (AuraApplication *aurApp, AuraRemoveMode removeMode)
 
void _RemoveNoStackAuraApplicationsDueToAura (Aura *aura)
 
void _RemoveNoStackAurasDueToAura (Aura *aura)
 
bool _IsNoStackAuraDueToAura (Aura *appliedAura, Aura *existingAura) const
 
void _RegisterAuraEffect (AuraEffect *aurEff, bool apply)
 
AuraMapGetOwnedAuras ()
 
AuraMap const & GetOwnedAuras () const
 
void RemoveOwnedAura (AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveOwnedAura (Aura *aura, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
AuraGetOwnedAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
 
AuraApplicationMapGetAppliedAuras ()
 
AuraApplicationMap const & GetAppliedAuras () const
 
void RemoveAura (AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (AuraApplication *aurApp, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAura (Aura *aur, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveBindSightAuras ()
 
void RemoveAppliedAuras (std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (std::function< bool(Aura const *)> const &check)
 
void RemoveAppliedAuras (uint32 spellId, std::function< bool(AuraApplication const *)> const &check)
 
void RemoveOwnedAuras (uint32 spellId, std::function< bool(Aura const *)> const &check)
 
void RemoveAurasDueToSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAuraFromStack (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
 
void RemoveAurasDueToSpellByDispel (uint32 spellId, uint32 dispellerSpellId, ObjectGuid casterGUID, Unit *dispeller, uint8 chargesRemoved=1)
 
void RemoveAurasDueToSpellBySteal (uint32 spellId, ObjectGuid casterGUID, Unit *stealer)
 
void RemoveAurasDueToItemSpell (uint32 spellId, ObjectGuid castItemGuid)
 
void RemoveAurasByType (AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
 
void RemoveNotOwnSingleTargetAuras ()
 
void RemoveAurasWithInterruptFlags (uint32 flag, uint32 except=0, bool isAutoshot=false)
 
void RemoveAurasWithAttribute (uint32 flags)
 
void RemoveAurasWithFamily (SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID)
 
void RemoveAurasWithMechanic (uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
 
void RemoveMovementImpairingAuras (bool withRoot)
 
void RemoveAurasByShapeShift ()
 
void RemoveAreaAurasDueToLeaveWorld ()
 
void RemoveAllAuras ()
 
void RemoveArenaAuras ()
 
void RemoveAllAurasOnDeath ()
 
void RemoveAllAurasRequiringDeadTarget ()
 
void RemoveAllAurasExceptType (AuraType type)
 
void RemoveEvadeAuras ()
 
void DelayOwnedAuras (uint32 spellId, ObjectGuid caster, int32 delaytime)
 
void _RemoveAllAuraStatMods ()
 
void _ApplyAllAuraStatMods ()
 
AuraEffectList const & GetAuraEffectsByType (AuraType type) const
 
AuraListGetSingleCastAuras ()
 
AuraList const & GetSingleCastAuras () const
 
AuraEffectGetAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectOfRankedSpell (uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraEffectGetAuraEffect (AuraType type, SpellFamilyNames family, uint32 familyFlag1, uint32 familyFlag2, uint32 familyFlag3, ObjectGuid casterGUID=ObjectGuid::Empty) const
 
AuraEffectGetAuraEffectDummy (uint32 spellid) const
 
AuraEffectGetDummyAuraEffect (SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
 
AuraApplicationGetAuraApplication (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
AuraApplicationGetAuraApplicationOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
 
AuraGetAuraOfRankedSpell (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
void GetDispellableAuraList (Unit *caster, uint32 dispelMask, DispelChargesList &dispelList, SpellInfo const *dispelSpell)
 
bool HasAuraEffect (uint32 spellId, uint8 effIndex, ObjectGuid caster=ObjectGuid::Empty) const
 
uint32 GetAuraCount (uint32 spellId) const
 
bool HasAuras (SearchMethod sm, std::vector< uint32 > &spellIds) const
 Check if unit has ANY or ALL specified auras.
 
template<typename... Auras>
bool HasAnyAuras (Auras... spellIds) const
 Checks if the unit has ANY specified auras.
 
template<typename... Auras>
bool HasAllAuras (Auras... spellIds) const
 Checks if the unit has ALL specified auras.
 
bool HasAura (uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
 
bool HasAuraType (AuraType auraType) const
 
bool HasAuraTypeWithCaster (AuraType auratype, ObjectGuid caster) const
 
bool HasAuraTypeWithMiscvalue (AuraType auratype, int32 miscvalue) const
 
bool HasAuraTypeWithAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
bool HasAuraTypeWithValue (AuraType auratype, int32 value) const
 
bool HasAuraTypeWithTriggerSpell (AuraType auratype, uint32 triggerSpell) const
 
bool HasNegativeAuraWithInterruptFlag (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasVisibleAuraType (AuraType auraType) const
 
bool HasNegativeAuraWithAttribute (uint32 flag, ObjectGuid guid=ObjectGuid::Empty)
 
bool HasAuraWithMechanic (uint32 mechanicMask) const
 
bool HasAuraTypeWithFamilyFlags (AuraType auraType, uint32 familyName, uint32 familyFlags) const
 
bool HasBreakableByDamageAuraType (AuraType type, uint32 excludeAura=0) const
 
bool HasBreakableByDamageCrowdControlAura (Unit *excludeCasterChannel=nullptr) const
 
AuraEffectIsScriptOverriden (SpellInfo const *spell, int32 script) const
 
uint32 GetDiseasesByCaster (ObjectGuid casterGUID, uint8 mode=0)
 
uint32 GetDoTsByCaster (ObjectGuid casterGUID) const
 
int32 GetTotalAuraModifierAreaExclusive (AuraType auratype) const
 
int32 GetTotalAuraModifier (AuraType auratype) const
 
float GetTotalAuraMultiplier (AuraType auratype) const
 
int32 GetMaxPositiveAuraModifier (AuraType auratype)
 
int32 GetMaxNegativeAuraModifier (AuraType auratype) const
 
int32 GetTotalAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
float GetTotalAuraMultiplierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetMaxPositiveAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
 
int32 GetMaxNegativeAuraModifierByMiscMask (AuraType auratype, uint32 misc_mask) const
 
int32 GetTotalAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
float GetTotalAuraMultiplierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxPositiveAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetMaxNegativeAuraModifierByMiscValue (AuraType auratype, int32 misc_value) const
 
int32 GetTotalAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
float GetTotalAuraMultiplierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxPositiveAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
int32 GetMaxNegativeAuraModifierByAffectMask (AuraType auratype, SpellInfo const *affectedSpell) const
 
VisibleAuraMap const * GetVisibleAuras ()
 
AuraApplicationGetVisibleAura (uint8 slot)
 
void SetVisibleAura (uint8 slot, AuraApplication *aur)
 
void RemoveVisibleAura (uint8 slot)
 
void ModifyAuraState (AuraStateType flag, bool apply)
 
uint32 BuildAuraStateUpdateForTarget (Unit *target) const
 
bool HasAuraState (AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
 
bool CanProc ()
 
void SetCantProc (bool apply)
 
void ProcDamageAndSpellFor (bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
void GetProcAurasTriggeredOnEvent (std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
 
void TriggerAurasProcOnEvent (CalcDamageInfo &damageInfo)
 
void TriggerAurasProcOnEvent (std::list< AuraApplication * > *myProcAuras, std::list< AuraApplication * > *targetProcAuras, Unit *actionTarget, uint32 typeMaskActor, uint32 typeMaskActionTarget, uint32 spellTypeMask, uint32 spellPhaseMask, uint32 hitMask, Spell *spell, DamageInfo *damageInfo, HealInfo *healInfo)
 
void TriggerAurasProcOnEvent (ProcEventInfo &eventInfo, std::list< AuraApplication * > &procAuras)
 
float GetWeaponProcChance () const
 
float GetPPMProcChance (uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
 
PlayerGetSpellModOwner () const
 
SpellGetCurrentSpell (CurrentSpellTypes spellType) const
 
SpellGetCurrentSpell (uint32 spellType) const
 
SpellGetFirstCurrentCastingSpell () const
 
SpellFindCurrentSpellBySpellId (uint32 spell_id) const
 
int32 GetCurrentSpellCastTime (uint32 spell_id) const
 
virtual bool HasSpell (uint32) const
 
void SetCurrentCastedSpell (Spell *pSpell)
 
virtual void ProhibitSpellSchool (SpellSchoolMask, uint32)
 
void SetInstantCast (bool set)
 
bool CanInstantCast () const
 
bool IsNonMeleeSpellCast (bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
 
void InterruptNonMeleeSpells (bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
 
float GetSpellMaxRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
float GetSpellMinRangeForTarget (Unit const *target, SpellInfo const *spellInfo) const
 
uint32 GetInterruptMask () const
 
void AddInterruptMask (uint32 mask)
 
void UpdateInterruptMask ()
 
void InterruptSpell (CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
 
bool isSpellBlocked (Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
 
void FinishSpell (CurrentSpellTypes spellType, bool ok=true)
 
UnitGetMagicHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo)
 
UnitGetMeleeHitRedirectTarget (Unit *victim, SpellInfo const *spellInfo=nullptr)
 
float MeleeSpellMissChance (Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
 
SpellMissInfo MeleeSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo MagicSpellHitResult (Unit *victim, SpellInfo const *spell)
 
SpellMissInfo SpellHitResult (Unit *victim, SpellInfo const *spell, bool canReflect=false)
 
SpellMissInfo SpellHitResult (Unit *victim, Spell const *spell, bool canReflect=false)
 
void SendHealSpellLog (HealInfo const &healInfo, bool critical=false)
 
int32 HealBySpell (HealInfo &healInfo, bool critical=false)
 
int32 SpellBaseHealingBonusDone (SpellSchoolMask schoolMask)
 
int32 SpellBaseHealingBonusTaken (SpellSchoolMask schoolMask)
 
float SpellPctHealingModsDone (Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
 
uint32 SpellHealingBonusDone (Unit *victim, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint8 effIndex, float TotalMod=0.0f, uint32 stack=1)
 
uint32 SpellHealingBonusTaken (Unit *caster, SpellInfo const *spellProto, uint32 healamount, DamageEffectType damagetype, uint32 stack=1)
 
void SendEnergizeSpellLog (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void EnergizeBySpell (Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
 
void ApplySpellImmune (uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
 
void ApplySpellDispelImmunity (SpellInfo const *spellProto, DispelType type, bool apply)
 
virtual bool IsImmunedToSpell (SpellInfo const *spellInfo, Spell const *spell=nullptr)
 
bool IsImmunedToDamage (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamage (SpellInfo const *spellInfo) const
 
bool IsImmunedToDamage (Spell const *spell) const
 
bool IsImmunedToSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToSchool (SpellInfo const *spellInfo) const
 
bool IsImmunedToSchool (Spell const *spell) const
 
bool IsImmunedToDamageOrSchool (SpellSchoolMask meleeSchoolMask) const
 
bool IsImmunedToDamageOrSchool (SpellInfo const *spellInfo) const
 
virtual bool IsImmunedToSpellEffect (SpellInfo const *spellInfo, uint32 index) const
 
bool isBlockCritical ()
 
float SpellDoneCritChance (Unit const *, SpellInfo const *spellProto, SpellSchoolMask schoolMask, WeaponAttackType attackType, bool skipEffectCheck) const
 
float SpellTakenCritChance (Unit const *caster, SpellInfo const *spellProto, SpellSchoolMask schoolMask, float doneChance, WeaponAttackType attackType, bool skipEffectCheck) const
 
float ApplyEffectModifiers (SpellInfo const *spellProto, uint8 effect_index, float value) const
 
int32 CalcSpellDuration (SpellInfo const *spellProto)
 
int32 ModSpellDuration (SpellInfo const *spellProto, Unit const *target, int32 duration, bool positive, uint32 effectMask)
 
void ModSpellCastTime (SpellInfo const *spellProto, int32 &castTime, Spell *spell=nullptr)
 
float CalculateLevelPenalty (SpellInfo const *spellProto) const
 
uint32 GetCastingTimeForBonus (SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
 
void CastDelayedSpellWithPeriodicAmount (Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
 
SpellCastResult CastSpell (SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, uint32 spellId, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (Unit *victim, SpellInfo const *spellInfo, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (float x, float y, float z, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastSpell (GameObject *go, uint32 spellId, bool triggered, Item *castItem=nullptr, AuraEffect *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, SpellValueMod mod, int32 value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
SpellCastResult CastCustomSpell (uint32 spellId, CustomSpellValues const &value, Unit *victim=nullptr, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
 
void _RegisterDynObject (DynamicObject *dynObj)
 
void _UnregisterDynObject (DynamicObject *dynObj)
 
DynamicObjectGetDynObject (uint32 spellId)
 
bool RemoveDynObject (uint32 spellId)
 
void RemoveAllDynObjects ()
 
GameObjectGetGameObject (uint32 spellId) const
 
void AddGameObject (GameObject *gameObj)
 
void RemoveGameObject (GameObject *gameObj, bool del)
 
void RemoveGameObject (uint32 spellid, bool del)
 
void RemoveAllGameObjects ()
 
bool IsPolymorphed () const
 
bool isFrozen () const
 
bool IsInFlight () const
 
bool IsLevitating () const
 
bool IsWalking () const
 
bool isMoving () const
 
bool isTurning () const
 
bool IsHovering () const
 
bool isSwimming () const
 
virtual bool CanFly () const =0
 
bool IsFlying () const
 
bool IsFalling () const
 
float GetHoverHeight () const
 
virtual bool IsMovementPreventedByCasting () const
 
virtual bool CanEnterWater () const =0
 
virtual bool CanSwim () const
 this method checks the current flag of a unit
 
bool CanFreeMove () const
 
bool HasLeewayMovement () const
 
void KnockbackFrom (float x, float y, float speedXY, float speedZ)
 
void JumpTo (float speedXY, float speedZ, bool forward=true)
 
void JumpTo (WorldObject *obj, float speedZ)
 
void UpdateSpeed (UnitMoveType mtype, bool forced)
 
float GetSpeed (UnitMoveType mtype) const
 
float GetSpeedRate (UnitMoveType mtype) const
 
void SetSpeed (UnitMoveType mtype, float rate, bool forced=false)
 
void SetSpeedRate (UnitMoveType mtype, float rate)
 
void propagateSpeedChange ()
 
void SendMonsterMove (float NewPosX, float NewPosY, float NewPosZ, uint32 TransitTime, SplineFlags sf=SPLINEFLAG_WALK_MODE)
 
void MonsterMoveWithSpeed (float x, float y, float z, float speed)
 
virtual bool SetWalk (bool enable)
 
virtual bool SetDisableGravity (bool disable, bool packetOnly=false, bool updateAnimationTier=true)
 
virtual bool SetSwim (bool enable)
 
virtual bool SetCanFly (bool enable, bool packetOnly=false)
 Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().
 
virtual bool SetWaterWalking (bool enable, bool packetOnly=false)
 Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.
 
virtual bool SetFeatherFall (bool enable, bool packetOnly=false)
 
virtual bool SetHover (bool enable, bool packetOnly=false, bool updateAnimationTier=true)
 
MotionMasterGetMotionMaster ()
 
const MotionMasterGetMotionMaster () const
 
virtual MovementGeneratorType GetDefaultMovementType () const
 -------—End of Pet responses methods-------—
 
bool IsStopped () const
 
void StopMoving ()
 
void StopMovingOnCurrentPos ()
 
virtual void PauseMovement (uint32 timer=0, uint8 slot=0)
 Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.
 
void ResumeMovement (uint32 timer=0, uint8 slot=0)
 
void SetControlled (bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
 
void DisableRotate (bool apply)
 
void DisableSpline ()
 
SheathState GetSheath () const
 
virtual void SetSheath (SheathState sheathed)
 
uint8 getStandState () const
 
bool IsSitState () const
 
bool IsStandState () const
 
void SetStandState (uint8 state)
 
void SetStandFlags (uint8 flags)
 
void RemoveStandFlags (uint8 flags)
 
DeathState getDeathState ()
 
virtual void setDeathState (DeathState s, bool despawn=false)
 
bool IsAlive () const
 
bool isDying () const
 
bool isDead () const
 
bool HasGhostAura () const
 
bool HasMountedAura () const
 
bool HasWaterWalkAura () const
 
bool HasFeatherFallAura () const
 
bool HasHoverAura () const
 
bool HasFlyAura () const
 
bool HasSpiritOfRedemptionAura () const
 
bool HasPreventsFleeingAura () const
 
bool HasPreventDurabilityLossAura () const
 
bool HasPreventResurectionAura () const
 
bool HasTransformAura () const
 
bool HasInterruptRegenAura () const
 
bool HasNoPVPCreditAura () const
 
bool HasWaterBreathingAura () const
 
bool HasIgnoreHitDirectionAura () const
 
bool HasSpellMagnetAura () const
 
bool HasOpenStableAura () const
 
bool HasCloneCasterAura () const
 
bool HasReflectSpellsAura () const
 
bool HasDetectAmoreAura () const
 
bool HasAllowOnlyAbilityAura () const
 
bool HasPeriodicDummyAura () const
 
bool HasControlVehicleAura () const
 
bool HasAOECharmAura () const
 
bool HasDetectSpellsAura () const
 
bool HasPacifySilenceAura () const
 
bool HasSilenceAura () const
 
bool HasShapeshiftAura () const
 
bool HasDecreaseSpeedAura () const
 
bool HasPacifyAura () const
 
bool HasIgnoreTargetResistAura () const
 
bool HasIncreaseMountedSpeedAura () const
 
bool HasIncreaseMountedFlightSpeedAura () const
 
bool HasThreatAura () const
 
bool HasAttackerSpellCritChanceAura () const
 
bool HasUnattackableAura () const
 
bool HasHealthRegenInCombatAura () const
 
bool HasRegenDuringCombatAura () const
 
bool HasFearAura () const
 
bool HasConfuseAura () const
 
bool HasRootAura () const
 
bool HasStunAura () const
 
bool HasTauntAura () const
 
bool HasStealthAura () const
 
bool HasStealthDetectAura () const
 
bool HasInvisibilityAura () const
 
bool HasInvisibilityDetectAura () const
 
bool IsHostileTo (Unit const *unit) const
 
bool IsHostileToPlayers () const
 
bool IsFriendlyTo (Unit const *unit) const
 
bool IsNeutralToAll () const
 
void ClearAllReactives ()
 
void StartReactiveTimer (ReactiveType reactive)
 
void UpdateReactives (uint32 p_time)
 
DiminishingLevels GetDiminishing (DiminishingGroup group)
 
void IncrDiminishing (DiminishingGroup group)
 
float ApplyDiminishingToDuration (DiminishingGroup group, int32 &duration, Unit *caster, DiminishingLevels Level, int32 limitduration)
 
void ApplyDiminishingAura (DiminishingGroup group, bool apply)
 
void ClearDiminishings ()
 
bool IsInPartyWith (Unit const *unit) const
 
bool IsInRaidWith (Unit const *unit) const
 
void GetPartyMembers (std::list< Unit * > &units)
 
UnitGetNextRandomRaidMemberOrPet (float radius)
 
void UpdateAuraForGroup (uint8 slot)
 
ReputationRank GetReactionTo (Unit const *target, bool checkOriginalFaction=false) const
 
ReputationRank GetFactionReactionTo (FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
 
SharedVisionList const & GetSharedVisionList ()
 
void AddPlayerToVision (Player *player)
 
void RemovePlayerFromVision (Player *player)
 
bool HasSharedVision () const
 
uint32 GetVirtualItemId (uint32 slot) const
 
void SetVirtualItem (uint32 slot, uint32 itemId)
 
bool IsMounted () const
 
uint32 GetMountID () const
 
void Mount (uint32 mount, uint32 vehicleId=0, uint32 creatureEntry=0)
 
void Dismount ()
 
bool IsInDisallowedMountForm () const
 
void addFollower (FollowerReference *pRef)
 
void removeFollower (FollowerReference *)
 
virtual float GetFollowAngle () const
 
GuardianGetGuardianPet () const
 
MinionGetFirstMinion () const
 
CreatureGetCompanionPet () const
 
PetCreateTamedPetFrom (Creature *creatureTarget, uint32 spell_id=0)
 
PetCreateTamedPetFrom (uint32 creatureEntry, uint32 spell_id=0)
 
bool InitTamedPet (Pet *pet, uint8 level, uint32 spell_id)
 
void SetMinion (Minion *minion, bool apply)
 
void GetAllMinionsByEntry (std::list< Creature * > &Minions, uint32 entry)
 
void RemoveAllMinionsByEntry (uint32 entry)
 
void AddPetAura (PetAura const *petSpell)
 
void RemovePetAura (PetAura const *petSpell)
 
void CastPetAura (PetAura const *aura)
 
bool IsPetAura (Aura const *aura)
 
void PetSpellFail (SpellInfo const *spellInfo, Unit *target, uint32 result)
 
void UnsummonAllTotems (bool onDeath=false)
 
TransportBaseGetDirectTransport () const
 
bool CreateVehicleKit (uint32 id, uint32 creatureEntry)
 Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
 
void RemoveVehicleKit ()
 
VehicleGetVehicleKit () const
 
VehicleGetVehicle () const
 
bool IsOnVehicle (Unit const *vehicle) const
 
UnitGetVehicleBase () const
 
CreatureGetVehicleCreatureBase () const
 
void EnterVehicle (Unit *base, int8 seatId=-1)
 
void EnterVehicleUnattackable (Unit *base, int8 seatId=-1)
 
void ExitVehicle (Position const *exitPosition=nullptr)
 
void ChangeSeat (int8 seatId, bool next=true)
 
bool HandleSpellClick (Unit *clicker, int8 seatId=-1)
 
void _ExitVehicle (Position const *exitPosition=nullptr)
 
void _EnterVehicle (Vehicle *vehicle, int8 seatId, AuraApplication const *aurApp=nullptr)
 
void HandleEmoteCommand (uint32 emoteId)
 
virtual void Talk (std::string_view text, ChatMsg msgType, Language language, float textRange, WorldObject const *target)
 
virtual void Say (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void Yell (std::string_view text, Language language, WorldObject const *target=nullptr)
 
virtual void TextEmote (std::string_view text, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (std::string_view text, Language language, Player *target, bool isBossWhisper=false)
 
virtual void Talk (uint32 textId, ChatMsg msgType, float textRange, WorldObject const *target)
 
virtual void Say (uint32 textId, WorldObject const *target=nullptr)
 
virtual void Yell (uint32 textId, WorldObject const *target=nullptr)
 
virtual void TextEmote (uint32 textId, WorldObject const *target=nullptr, bool isBossEmote=false)
 
virtual void Whisper (uint32 textId, Player *target, bool isBossWhisper=false)
 
ShapeshiftForm GetShapeshiftForm () const
 
void SetShapeshiftForm (ShapeshiftForm form)
 
bool IsAttackSpeedOverridenShapeShift () const
 
bool IsInFeralForm () const
 
void setTransForm (uint32 spellid)
 
uint32 getTransForm () const
 
void DeMorph ()
 
virtual float GetNativeObjectScale () const
 
virtual void RecalculateObjectScale ()
 
uint32 GetDisplayId () const
 
virtual void SetDisplayId (uint32 modelId, float displayScale=1.f)
 
uint32 GetNativeDisplayId () const
 
void RestoreDisplayId ()
 
void SetNativeDisplayId (uint32 displayId)
 
uint32 GetModelForForm (ShapeshiftForm form, uint32 spellId)
 
virtual bool IsInWater () const
 
virtual bool IsUnderWater () const
 
void NearTeleportTo (Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void NearTeleportTo (float x, float y, float z, float orientation, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
 
void SetInFront (WorldObject const *target)
 
void SetFacingTo (float ori)
 
void SetFacingToObject (WorldObject *object)
 
void SetTimedFacingToObject (WorldObject *object, uint32 time)
 
bool isInAccessiblePlaceFor (Creature const *c) const
 
bool isInFrontInMap (Unit const *target, float distance, float arc=M_PI) const
 
bool isInBackInMap (Unit const *target, float distance, float arc=M_PI) const
 
float GetCollisionHeight () const override
 Return collision height sent to client.
 
float GetCollisionWidth () const override
 this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
float GetCollisionRadius () const override
 this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC
 
void UpdateOrientation (float orientation)
 Only server-side orientation update, does not broadcast to client.
 
void UpdateHeight (float newZ)
 Only server-side height update, does not broadcast to client.
 
virtual bool UpdatePosition (float x, float y, float z, float ang, bool teleport=false)
 
bool UpdatePosition (const Position &pos, bool teleport=false)
 
void ProcessPositionDataChanged (PositionFullTerrainStatus const &data) override
 
virtual void ProcessTerrainStatusUpdate ()
 
bool IsVisible () const
 
void SetVisible (bool x)
 
void SetModelVisible (bool on)
 
uint32 GetPhaseByAuras () const
 
void SetPhaseMask (uint32 newPhaseMask, bool update) override
 
void UpdateObjectVisibility (bool forced=true, bool fromUpdate=false) override
 
void AddPointedBy (SafeUnitPointer *sup)
 
void RemovePointedBy (SafeUnitPointer *sup)
 
void SendAttackStateUpdate (CalcDamageInfo *damageInfo)
 
void SendAttackStateUpdate (uint32 HitInfo, Unit *target, uint8 SwingType, SpellSchoolMask damageSchoolMask, uint32 Damage, uint32 AbsorbDamage, uint32 Resist, VictimState TargetState, uint32 BlockedAmount)
 
void SendComboPoints ()
 
void SendPlaySpellVisual (uint32 id)
 
void SendPlaySpellImpact (ObjectGuid guid, uint32 id)
 
void SendPetActionFeedback (uint8 msg)
 -------—Pet responses methods--------------—
 
void SendPetTalk (uint32 pettalk)
 
void SendPetAIReaction (ObjectGuid guid)
 
void SendPeriodicAuraLog (SpellPeriodicAuraLogInfo *pInfo)
 
void SendSpellNonMeleeDamageLog (SpellNonMeleeDamage *log)
 
void SendSpellNonMeleeReflectLog (SpellNonMeleeDamage *log, Unit *attacker)
 
void SendSpellNonMeleeDamageLog (Unit *target, SpellInfo const *spellInfo, uint32 Damage, SpellSchoolMask damageSchoolMask, uint32 AbsorbedDamage, uint32 Resist, bool PhysicalDamage, uint32 Blocked, bool CriticalHit=false, bool Split=false)
 
void SendSpellMiss (Unit *target, uint32 spellID, SpellMissInfo missInfo)
 
void SendSpellDamageResist (Unit *target, uint32 spellId)
 
void SendSpellDamageImmune (Unit *target, uint32 spellId)
 
void SendTameFailure (uint8 result)
 
void SendTeleportPacket (Position &pos)
 
void SendMovementFlagUpdate (bool self=false)
 
void SendMovementWaterWalking (Player *sendTo)
 
void SendMovementFeatherFall (Player *sendTo)
 
void SendMovementHover (Player *sendTo)
 
void SendChangeCurrentVictimOpcode (HostileReference *pHostileReference)
 
void SendClearThreatListOpcode ()
 
void SendRemoveFromThreatListOpcode (HostileReference *pHostileReference)
 
void SendThreatListUpdate ()
 
void SendClearTarget ()
 
void ExecuteDelayedUnitRelocationEvent ()
 
void ExecuteDelayedUnitAINotifyEvent ()
 
void BuildHeartBeatMsg (WorldPacket *data) const
 
void BuildMovementPacket (ByteBuffer *data) const
 
void OutDebugInfo () const
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from WorldObject
 ~WorldObject () override
 
void _Create (ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
 
void AddToWorld () override
 
void RemoveFromWorld () override
 
void GetNearPoint2D (WorldObject const *searcher, float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint2D (float &x, float &y, float distance, float absAngle, Position const *startPos=nullptr) const
 
void GetNearPoint (WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
 
void GetVoidClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float relAngle=0, float controlZ=0) const
 
bool GetClosePoint (float &x, float &y, float &z, float size, float distance2d=0, float angle=0, WorldObject const *forWho=nullptr, bool force=false) const
 
void MovePosition (Position &pos, float dist, float angle)
 
Position GetNearPosition (float dist, float angle)
 
void MovePositionToFirstCollision (Position &pos, float dist, float angle)
 
Position GetFirstCollisionPosition (float startX, float startY, float startZ, float destX, float destY)
 
Position GetFirstCollisionPosition (float destX, float destY, float destZ)
 
Position GetFirstCollisionPosition (float dist, float angle)
 
Position GetRandomNearPosition (float radius)
 
void GetContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
void GetChargeContactPoint (WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
 
float GetObjectSize () const
 
void UpdateGroundPositionZ (float x, float y, float &z) const
 
void UpdateAllowedPositionZ (float x, float y, float &z, float *groundZ=nullptr) const
 
void GetRandomPoint (const Position &srcPos, float distance, float &rand_x, float &rand_y, float &rand_z) const
 
Position GetRandomPoint (const Position &srcPos, float distance) const
 
uint32 GetInstanceId () const
 
uint32 GetPhaseMask () const
 
bool InSamePhase (WorldObject const *obj) const
 
bool InSamePhase (uint32 phasemask) const
 
uint32 GetZoneId () const
 
uint32 GetAreaId () const
 
void GetZoneAndAreaId (uint32 &zoneid, uint32 &areaid) const
 
bool IsOutdoors () const
 
LiquidData const & GetLiquidData () const
 
InstanceScriptGetInstanceScript () const
 
std::string const & GetName () const
 
void SetName (std::string const &newname)
 
virtual std::string const & GetNameForLocaleIdx (LocaleConstant) const
 
float GetDistance (WorldObject const *obj) const
 
float GetDistance (const Position &pos) const
 
float GetDistance (float x, float y, float z) const
 
float GetDistance2d (WorldObject const *obj) const
 
float GetDistance2d (float x, float y) const
 
float GetDistanceZ (WorldObject const *obj) const
 
bool IsSelfOrInSameMap (WorldObject const *obj) const
 
bool IsInMap (WorldObject const *obj) const
 
bool IsWithinDist3d (float x, float y, float z, float dist) const
 
bool IsWithinDist3d (const Position *pos, float dist) const
 
bool IsWithinDist2d (float x, float y, float dist) const
 
bool IsWithinDist2d (const Position *pos, float dist) const
 
bool IsWithinDist (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinDistInMap (WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
 
bool IsWithinLOS (float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
 
bool IsWithinLOSInMap (WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
Position GetHitSpherePointFor (Position const &dest, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
void GetHitSpherePointFor (Position const &dest, float &x, float &y, float &z, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
 
bool GetDistanceOrder (WorldObject const *obj1, WorldObject const *obj2, bool is3D=true) const
 
bool IsInRange (WorldObject const *obj, float minRange, float maxRange, bool is3D=true) const
 
bool IsInRange2d (float x, float y, float minRange, float maxRange) const
 
bool IsInRange3d (float x, float y, float z, float minRange, float maxRange) const
 
bool isInFront (WorldObject const *target, float arc=M_PI) const
 
bool isInBack (WorldObject const *target, float arc=M_PI) const
 
bool IsInBetween (WorldObject const *obj1, WorldObject const *obj2, float size=0) const
 
virtual void SendMessageToSet (WorldPacket const *data, bool self) const
 
virtual void SendMessageToSetInRange (WorldPacket const *data, float dist, bool self) const
 
virtual void SendMessageToSet (WorldPacket const *data, Player const *skipped_rcvr) const
 
void PlayDistanceSound (uint32 sound_id, Player *target=nullptr)
 
void PlayDirectSound (uint32 sound_id, Player *target=nullptr)
 
void PlayRadiusSound (uint32 sound_id, float radius)
 
void PlayDirectMusic (uint32 music_id, Player *target=nullptr)
 
void PlayRadiusMusic (uint32 music_id, float radius)
 
void SendObjectDeSpawnAnim (ObjectGuid guid)
 
virtual void SaveRespawnTime ()
 
void AddObjectToRemoveList ()
 
float GetGridActivationRange () const
 
float GetVisibilityRange () const
 
virtual float GetSightRange (WorldObject const *target=nullptr) const
 
bool CanSeeOrDetect (WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
 
void SendPlayMusic (uint32 Music, bool OnlySelf)
 
virtual void SetMap (Map *map)
 
virtual void ResetMap ()
 
MapGetMap () const
 
MapFindMap () const
 
void SetZoneScript ()
 
void ClearZoneScript ()
 
ZoneScriptGetZoneScript () const
 
TempSummonSummonCreature (uint32 id, const Position &pos, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, uint32 vehId=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false) const
 
TempSummonSummonCreature (uint32 id, float x, float y, float z, float ang=0, TempSummonType spwtype=TEMPSUMMON_MANUAL_DESPAWN, uint32 despwtime=0, SummonPropertiesEntry const *properties=nullptr, bool visibleBySummonerOnly=false)
 
GameObjectSummonGameObject (uint32 entry, float x, float y, float z, float ang, float rotation0, float rotation1, float rotation2, float rotation3, uint32 respawnTime, bool checkTransport=true, GOSummonType summonType=GO_SUMMON_TIMED_OR_CORPSE_DESPAWN)
 
CreatureSummonTrigger (float x, float y, float z, float ang, uint32 dur, bool setLevel=false, CreatureAI *(*GetAI)(Creature *)=nullptr)
 
void SummonCreatureGroup (uint8 group, std::list< TempSummon * > *list=nullptr)
 
CreatureFindNearestCreature (uint32 entry, float range, bool alive=true) const
 
GameObjectFindNearestGameObject (uint32 entry, float range, bool onlySpawned=false) const
 
GameObjectFindNearestGameObjectOfType (GameobjectTypes type, float range) const
 
PlayerSelectNearestPlayer (float distance=0) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetGameObjectListWithEntryInGrid (std::list< GameObject * > &gameobjectList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &lList, uint32 uiEntry, float fMaxSearchRange) const
 
void GetCreatureListWithEntryInGrid (std::list< Creature * > &creatureList, std::vector< uint32 > const &entries, float maxSearchRange) const
 
void GetDeadCreatureListInGrid (std::list< Creature * > &lList, float maxSearchRange, bool alive=false) const
 
void DestroyForNearbyPlayers ()
 
virtual void UpdateObjectVisibilityOnCreate ()
 
void BuildUpdate (UpdateDataMapType &data_map, UpdatePlayerSet &player_set) override
 
void GetCreaturesWithEntryInRange (std::list< Creature * > &creatureList, float radius, uint32 entry)
 
void SetPositionDataUpdate ()
 
void UpdatePositionData ()
 
void AddToObjectUpdate () override
 
void RemoveFromObjectUpdate () override
 
void AddToNotify (uint16 f)
 
void RemoveFromNotify (uint16 f)
 
bool isNeedNotify (uint16 f) const
 
uint16 GetNotifyFlags () const
 
bool NotifyExecuted (uint16 f) const
 
void SetNotified (uint16 f)
 
void ResetAllNotifies ()
 
bool isActiveObject () const
 
void setActive (bool isActiveObject)
 
bool IsFarVisible () const
 
bool IsVisibilityOverridden () const
 
void SetVisibilityDistanceOverride (VisibilityDistanceType type)
 
bool IsWorldObject () const
 
bool IsInWintergrasp () const
 
TransportGetTransport () const
 
float GetTransOffsetX () const
 
float GetTransOffsetY () const
 
float GetTransOffsetZ () const
 
float GetTransOffsetO () const
 
uint32 GetTransTime () const
 
int8 GetTransSeat () const
 
void SetTransport (Transport *t)
 
virtual float GetStationaryX () const
 
virtual float GetStationaryY () const
 
virtual float GetStationaryZ () const
 
virtual float GetStationaryO () const
 
float GetMapWaterOrGroundLevel (Position pos, float *ground=nullptr) const
 
float GetMapWaterOrGroundLevel (float x, float y, float z, float *ground=nullptr) const
 
float GetMapHeight (float x, float y, float z, bool vmap=true, float distanceToSearch=50.0f) const
 
float GetFloorZ () const
 
float GetMinHeightInWater () const
 Get the minimum height of a object that should be in water to start floating/swim.
 
void AddAllowedLooter (ObjectGuid guid)
 
void ResetAllowedLooters ()
 
void SetAllowedLooters (GuidUnorderedSet const looters)
 
bool HasAllowedLooter (ObjectGuid guid) const
 
GuidUnorderedSet const & GetAllowedLooters () const
 
void RemoveAllowedLooter (ObjectGuid guid)
 
virtual bool IsUpdateNeeded ()
 
bool CanBeAddedToMapUpdateList ()
 
std::string GetDebugInfo () const override
 
- Public Member Functions inherited from Object
virtual ~Object ()
 
bool IsInWorld () const
 
ObjectGuid GetGUID () const
 
PackedGuid const & GetPackGUID () const
 
uint32 GetEntry () const
 
void SetEntry (uint32 entry)
 
float GetObjectScale () const
 
virtual void SetObjectScale (float scale)
 
bool HasDynamicFlag (uint32 flag) const
 
virtual void SetDynamicFlag (uint32 flag)
 
virtual void RemoveDynamicFlag (uint32 flag)
 
TypeID GetTypeId () const
 
bool isType (uint16 mask) const
 
virtual void BuildCreateUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void SendUpdateToPlayer (Player *player)
 
void BuildValuesUpdateBlockForPlayer (UpdateData *data, Player *target)
 
void BuildOutOfRangeUpdateBlock (UpdateData *data) const
 
void BuildMovementUpdateBlock (UpdateData *data, uint32 flags=0) const
 
virtual void DestroyForPlayer (Player *target, bool onDeath=false) const
 
int32 GetInt32Value (uint16 index) const
 
uint32 GetUInt32Value (uint16 index) const
 
uint64 GetUInt64Value (uint16 index) const
 
float GetFloatValue (uint16 index) const
 
uint8 GetByteValue (uint16 index, uint8 offset) const
 
uint16 GetUInt16Value (uint16 index, uint8 offset) const
 
ObjectGuid GetGuidValue (uint16 index) const
 
void SetInt32Value (uint16 index, int32 value)
 
void SetUInt32Value (uint16 index, uint32 value)
 
void UpdateUInt32Value (uint16 index, uint32 value)
 
void SetUInt64Value (uint16 index, uint64 value)
 
void SetFloatValue (uint16 index, float value)
 
void SetByteValue (uint16 index, uint8 offset, uint8 value)
 
void SetUInt16Value (uint16 index, uint8 offset, uint16 value)
 
void SetInt16Value (uint16 index, uint8 offset, int16 value)
 
void SetGuidValue (uint16 index, ObjectGuid value)
 
void SetStatFloatValue (uint16 index, float value)
 
void SetStatInt32Value (uint16 index, int32 value)
 
bool AddGuidValue (uint16 index, ObjectGuid value)
 
bool RemoveGuidValue (uint16 index, ObjectGuid value)
 
void ApplyModUInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModInt32Value (uint16 index, int32 val, bool apply)
 
void ApplyModUInt64Value (uint16 index, int32 val, bool apply)
 
void ApplyModPositiveFloatValue (uint16 index, float val, bool apply)
 
void ApplyModSignedFloatValue (uint16 index, float val, bool apply)
 
void ApplyPercentModFloatValue (uint16 index, float val, bool apply)
 
void SetFlag (uint16 index, uint32 newFlag)
 
void RemoveFlag (uint16 index, uint32 oldFlag)
 
void ToggleFlag (uint16 index, uint32 flag)
 
bool HasFlag (uint16 index, uint32 flag) const
 
void ApplyModFlag (uint16 index, uint32 flag, bool apply)
 
void SetByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
void RemoveByteFlag (uint16 index, uint8 offset, uint8 newFlag)
 
bool HasByteFlag (uint16 index, uint8 offset, uint8 flag) const
 
void SetFlag64 (uint16 index, uint64 newFlag)
 
void RemoveFlag64 (uint16 index, uint64 oldFlag)
 
void ToggleFlag64 (uint16 index, uint64 flag)
 
bool HasFlag64 (uint16 index, uint64 flag) const
 
void ApplyModFlag64 (uint16 index, uint64 flag, bool apply)
 
void ClearUpdateMask (bool remove)
 
uint16 GetValuesCount () const
 
virtual bool hasQuest (uint32) const
 
virtual bool hasInvolvedQuest (uint32) const
 
void BuildFieldsUpdate (Player *, UpdateDataMapType &)
 
void SetFieldNotifyFlag (uint16 flag)
 
void RemoveFieldNotifyFlag (uint16 flag)
 
void ForceValuesUpdateAtIndex (uint32)
 
bool IsPlayer () const
 
PlayerToPlayer ()
 
Player const * ToPlayer () const
 
bool IsCreature () const
 
CreatureToCreature ()
 
Creature const * ToCreature () const
 
bool IsUnit () const
 
UnitToUnit ()
 
Unit const * ToUnit () const
 
bool IsGameObject () const
 
GameObjectToGameObject ()
 
GameObject const * ToGameObject () const
 
bool IsCorpse () const
 
CorpseToCorpse ()
 
Corpse const * ToCorpse () const
 
bool IsDynamicObject () const
 
DynamicObjectToDynObject ()
 
DynamicObject const * ToDynObject () const
 
bool IsItem () const
 
virtual void Heartbeat ()
 
template<typename... T>
bool EntryEquals (T... entries) const
 
- Public Member Functions inherited from WorldLocation
 WorldLocation (uint32 _mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
 WorldLocation (uint32 mapId, Position const &position)
 
void WorldRelocate (const WorldLocation &loc)
 
void WorldRelocate (uint32 mapId=MAPID_INVALID, float x=0.f, float y=0.f, float z=0.f, float o=0.f)
 
void SetMapId (uint32 mapId)
 
uint32 GetMapId () const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z) const
 
void GetWorldLocation (uint32 &mapId, float &x, float &y, float &z, float &o) const
 
void GetWorldLocation (WorldLocation *location) const
 
WorldLocation GetWorldLocation () const
 
std::string GetDebugInfo () const
 
- Public Member Functions inherited from Position
 Position (float x=0, float y=0, float z=0, float o=0)
 
 Position (Position const &loc)
 
 Position (Position &&)=default
 
Positionoperator= (const Position &)=default
 
Positionoperator= (Position &&)=default
 
bool operator== (Position const &a) const
 
bool operator!= (Position const &a)
 
bool operator!= (Position const &a) const
 
 operator G3D::Vector3 () const
 
void Relocate (float x, float y)
 
void Relocate (float x, float y, float z)
 
void Relocate (float x, float y, float z, float orientation)
 
void Relocate (const Position &pos)
 
void Relocate (const Position *pos)
 
void RelocatePolarOffset (float angle, float dist, float z=0.0f)
 
void RelocateOffset (const Position &offset)
 
void SetOrientation (float orientation)
 
float GetPositionX () const
 
float GetPositionY () const
 
float GetPositionZ () const
 
float GetOrientation () const
 
void GetPosition (float &x, float &y) const
 
void GetPosition (float &x, float &y, float &z) const
 
void GetPosition (float &x, float &y, float &z, float &o) const
 
Position GetPosition () const
 
Position::PositionXYZStreamer PositionXYZStream ()
 
Position::PositionXYZOStreamer PositionXYZOStream ()
 
bool IsPositionValid () const
 
float GetExactDist2dSq (const float x, const float y) const
 
float GetExactDist2dSq (Position const &pos) const
 
float GetExactDist2dSq (Position const *pos) const
 
float GetExactDist2d (const float x, const float y) const
 
float GetExactDist2d (Position const &pos) const
 
float GetExactDist2d (Position const *pos) const
 
float GetExactDistSq (float x, float y, float z) const
 
float GetExactDistSq (Position const &pos) const
 
float GetExactDistSq (Position const *pos) const
 
float GetExactDist (float x, float y, float z) const
 
float GetExactDist (Position const &pos) const
 
float GetExactDist (Position const *pos) const
 
void GetPositionOffsetTo (const Position &endPos, Position &retOffset) const
 
Position GetPositionWithOffset (Position const &offset) const
 
float GetAngle (const Position *pos) const
 
float GetAngle (float x, float y) const
 
float GetAbsoluteAngle (float x, float y) const
 
float GetAbsoluteAngle (Position const &pos) const
 
float GetAbsoluteAngle (Position const *pos) const
 
float GetRelativeAngle (const Position *pos) const
 
float GetRelativeAngle (float x, float y) const
 
float ToAbsoluteAngle (float relAngle) const
 
void GetSinCos (float x, float y, float &vsin, float &vcos) const
 
bool IsInDist2d (float x, float y, float dist) const
 
bool IsInDist2d (const Position *pos, float dist) const
 
bool IsInDist (float x, float y, float z, float dist) const
 
bool IsInDist (const Position *pos, float dist) const
 
bool IsWithinBox (const Position &center, float xradius, float yradius, float zradius) const
 
bool HasInArc (float arcangle, const Position *pos, float targetRadius=0.0f) const
 
bool HasInLine (Position const *pos, float width) const
 
std::string ToString () const
 

Static Public Member Functions

static void ApplyResilience (Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
 
static float GetEffectiveResistChance (Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
 
static uint32 DealDamage (Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
 
static void DealDamageMods (Unit const *victim, uint32 &damage, uint32 *absorb)
 
static void Kill (Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
 
static bool IsDamageReducedByArmor (SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
 
static uint32 CalcArmorReducedDamage (Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
 
static uint32 SpellCriticalDamageBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void ProcDamageAndSpell (Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
 
static int32 DealHeal (Unit *healer, Unit *victim, uint32 addhealth)
 
static uint32 SpellCriticalHealingBonus (Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
 
static void CalcAbsorbResist (DamageInfo &dmgInfo, bool Splited=false)
 
static void CalcHealAbsorb (HealInfo &healInfo)
 
static void HandleSafeUnitPointersOnDelete (Unit *thisUnit)
 
- Static Public Member Functions inherited from Object
static ObjectGuid GetGUID (Object const *o)
 
- Static Public Member Functions inherited from Position
static float NormalizeOrientation (float o)
 

Public Attributes

uint32 m_extraAttacks
 
bool m_canDualWield
 
ControlSet m_Controlled
 
SafeUnitPointer m_movedByPlayer
 
ObjectGuid m_SummonSlot [MAX_SUMMON_SLOT]
 
ObjectGuid m_ObjectSlot [MAX_GAMEOBJECT_SLOT]
 
float m_modMeleeHitChance
 
float m_modRangedHitChance
 
float m_modSpellHitChance
 
int32 m_baseSpellCritChance
 
float m_threatModifier [MAX_SPELL_SCHOOL]
 
float m_modAttackSpeedPct [3]
 
SpellImmuneList m_spellImmune [MAX_SPELL_IMMUNITY]
 
uint32 m_lastSanctuaryTime
 
PetAuraSet m_petAuras
 
bool IsAIEnabled
 
bool NeedChangeAI
 
bool m_ControlledByPlayer
 
bool m_CreatedByPlayer
 
std::set< SafeUnitPointer * > SafeUnitPointerSet
 
Position m_last_notify_position
 
uint32 m_last_notify_mstime
 
uint16 m_delayed_unit_relocation_timer
 
uint16 m_delayed_unit_ai_notify_timer
 
bool bRequestForcedVisibilityUpdate
 
Movement::MoveSplinemovespline
 
- Public Attributes inherited from WorldObject
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealth
 
FlaggedValuesArray32< int32, uint32, StealthType, TOTAL_STEALTH_TYPESm_stealthDetect
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibility
 
FlaggedValuesArray32< int32, uint32, InvisibilityType, TOTAL_INVISIBILITY_TYPESm_invisibilityDetect
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibility
 
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPESm_serverSideVisibilityDetect
 
uint32 LastUsedScriptID
 
MovementInfo m_movementInfo
 
ElunaEventProcessor * elunaEvents
 
EventProcessor m_Events
 
- Public Attributes inherited from Object
DataMap CustomData
 
- Public Attributes inherited from WorldLocation
uint32 m_mapId
 
- Public Attributes inherited from Position
float m_positionX = 0
 
float m_positionY = 0
 
float m_positionZ = 0
 
float m_orientation = 0
 

Protected Types

typedef std::list< DynamicObject * > DynObjectList
 
typedef GuidList GameObjectList
 
typedef std::map< ObjectGuid, float > CharmThreatMap
 

Protected Member Functions

 Unit (bool isWorldObject)
 
void BuildValuesUpdate (uint8 updateType, ByteBuffer *data, Player *target) override
 
void _UpdateSpells (uint32 time)
 
void _DeleteRemovedAuras ()
 
void _UpdateAutoRepeatSpell ()
 
bool CanSparringWith (Unit const *attacker) const
 
bool IsAlwaysVisibleFor (WorldObject const *seer) const override
 : Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.
 
bool IsAlwaysDetectableFor (WorldObject const *seer) const override
 
void SetFeared (bool apply, Unit *fearedBy=nullptr, bool isFear=false)
 
void SetConfused (bool apply)
 
void SetStunned (bool apply)
 
void SetRooted (bool apply, bool isStun=false)
 
- Protected Member Functions inherited from WorldObject
 WorldObject (bool isWorldObject)
 
void SetLocationMapId (uint32 _mapId)
 
void SetLocationInstanceId (uint32 _instanceId)
 
virtual bool IsNeverVisible () const
 
virtual bool IsInvisibleDueToDespawn () const
 
- Protected Member Functions inherited from Object
 Object ()
 
void _InitValues ()
 
void _Create (ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
 
std::string _ConcatFields (uint16 startIndex, uint16 size) const
 
bool _LoadIntoDataField (std::string const &data, uint32 startOffset, uint32 count)
 
uint32 GetUpdateFieldData (Player const *target, uint32 *&flags) const
 
void BuildMovementUpdate (ByteBuffer *data, uint16 flags) const
 
void AddToObjectUpdateIfNeeded ()
 

Protected Attributes

UnitAIi_AI
 
UnitAIi_disabledAI
 
uint8 m_realRace
 
uint8 m_race
 
bool m_AutoRepeatFirstCast
 
int32 m_attackTimer [MAX_ATTACK]
 
float m_createStats [MAX_STATS]
 
AttackerSet m_attackers
 
Unitm_attacking
 
DeathState m_deathState
 
int32 m_procDeep
 
DynObjectList m_dynObj
 
GameObjectList m_gameObj
 
uint32 m_transform
 
Spellm_currentSpells [CURRENT_MAX_SPELL]
 
AuraMap m_ownedAuras
 
AuraApplicationMap m_appliedAuras
 
AuraList m_removedAuras
 
AuraMap::iterator m_auraUpdateIterator
 
uint32 m_removedAurasCount
 
AuraEffectList m_modAuras [TOTAL_AURAS]
 
AuraList m_scAuras
 
AuraApplicationList m_interruptableAuras
 
AuraStateAurasMap m_auraStateAuras
 
uint32 m_interruptMask
 
float m_auraModifiersGroup [UNIT_MOD_END][MODIFIER_TYPE_END]
 
float m_weaponDamage [MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
 
bool m_canModifyStats
 
VisibleAuraMap m_visibleAuras
 
float m_speed_rate [MAX_MOVE_TYPE]
 
CharmInfom_charmInfo
 
SharedVisionList m_sharedVision
 
MotionMasteri_motionMaster
 
uint32 m_reactiveTimer [MAX_REACTIVE]
 
int32 m_regenTimer
 
ThreatMgr m_ThreatMgr
 
CharmThreatMap _charmThreatInfo
 
Vehiclem_vehicle
 
Vehiclem_vehicleKit
 
uint32 m_unitTypeMask
 
LiquidTypeEntry const * _lastLiquid
 
bool m_applyResilience
 
bool _instantCast
 
uint32 m_rootTimes
 
- Protected Attributes inherited from WorldObject
std::string m_name
 
bool m_isActive
 
bool m_isFarVisible
 
Optional< float > m_visibilityDistanceOverride
 
const bool m_isWorldObject
 
ZoneScriptm_zoneScript
 
uint32 _zoneId
 
uint32 _areaId
 
float _floorZ
 
bool _outdoors
 
LiquidData _liquidData
 
bool _updatePositionData
 
Transportm_transport
 
- Protected Attributes inherited from Object
uint16 m_objectType
 
TypeID m_objectTypeId
 
uint16 m_updateFlag
 
union { 
 
   int32 *   m_int32Values 
 
   uint32 *   m_uint32Values 
 
   float *   m_floatValues 
 
};  
 
UpdateMask _changesMask
 
uint16 m_valuesCount
 
uint16 _fieldNotifyFlags
 
bool m_objectUpdated
 

Private Types

typedef std::unordered_map< uint64, BuildValuesCachedBufferValuesUpdateCache
 

Private Member Functions

bool IsTriggeredAtSpellProcEvent (Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
 
bool HandleDummyAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
 
bool HandleAuraProc (Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
 
bool HandleProcTriggerSpell (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
 
bool HandleOverrideClassScriptAuraProc (Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
 
bool HandleAuraRaidProcFromChargeWithValue (AuraEffect *triggeredByAura)
 
bool HandleAuraRaidProcFromCharge (AuraEffect *triggeredByAura)
 
void UpdateSplineMovement (uint32 t_diff)
 
void UpdateSplinePosition ()
 
float GetCombatRatingReduction (CombatRating cr) const
 
uint32 GetCombatRatingDamageReduction (CombatRating cr, float rate, float cap, uint32 damage) const
 
void PatchValuesUpdate (ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
 
void InvalidateValuesUpdateCache ()
 
float processDummyAuras (float TakenTotalMod) const
 
void _addAttacker (Unit *pAttacker)
 
void _removeAttacker (Unit *pAttacker)
 

Private Attributes

uint32 m_state
 
uint32 m_CombatTimer
 
uint32 m_lastManaUse
 
Diminishing m_Diminishing
 
HostileRefMgr m_HostileRefMgr
 
FollowerRefMgr m_FollowingRefMgr
 
Unitm_comboTarget
 
int8 m_comboPoints
 
std::unordered_set< Unit * > m_ComboPointHolders
 
RedirectThreatInfo _redirectThreatInfo
 
bool m_cleanupDone
 
bool m_duringRemoveFromWorld
 
uint32 _oldFactionId
 faction before charm
 
bool _isWalkingBeforeCharm
 Are we walking before we were charmed?
 
uint32 _lastExtraAttackSpell
 
std::unordered_map< ObjectGuid, uint32extraAttacksTargets
 
ObjectGuid _lastDamagedTargetGuid
 
ValuesUpdateCache _valuesUpdateCache
 

Detailed Description

Member Typedef Documentation

◆ AttackerSet

typedef std::unordered_set<Unit*> Unit::AttackerSet

◆ AuraApplicationList

◆ AuraApplicationMap

◆ AuraApplicationMapBounds

typedef std::pair<AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator> Unit::AuraApplicationMapBounds

◆ AuraApplicationMapBoundsNonConst

typedef std::pair<AuraApplicationMap::iterator, AuraApplicationMap::iterator> Unit::AuraApplicationMapBoundsNonConst

◆ AuraEffectList

typedef std::vector<AuraEffect*> Unit::AuraEffectList

◆ AuraList

typedef std::list<Aura*> Unit::AuraList

◆ AuraMap

typedef std::multimap<uint32, Aura*> Unit::AuraMap

◆ AuraMapBounds

typedef std::pair<AuraMap::const_iterator, AuraMap::const_iterator> Unit::AuraMapBounds

◆ AuraMapBoundsNonConst

typedef std::pair<AuraMap::iterator, AuraMap::iterator> Unit::AuraMapBoundsNonConst

◆ AuraStateAurasMap

◆ AuraStateAurasMapBounds

typedef std::pair<AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator> Unit::AuraStateAurasMapBounds

◆ CharmThreatMap

typedef std::map<ObjectGuid, float> Unit::CharmThreatMap
protected

◆ ComboPointHolderSet

◆ ControlSet

typedef std::set<Unit*> Unit::ControlSet

◆ Diminishing

◆ DynObjectList

typedef std::list<DynamicObject*> Unit::DynObjectList
protected

◆ GameObjectList

typedef GuidList Unit::GameObjectList
protected

◆ PetAuraSet

typedef std::set<PetAura const*> Unit::PetAuraSet

◆ ValuesUpdateCache

typedef std::unordered_map<uint64 , BuildValuesCachedBuffer> Unit::ValuesUpdateCache
private

◆ VisibleAuraMap

Constructor & Destructor Documentation

◆ ~Unit()

Unit::~Unit ( )
override
340{
341 // set current spells as deletable
342 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
343 if (m_currentSpells[i])
344 {
346 m_currentSpells[i] = nullptr;
347 }
348
350
351 delete i_motionMaster;
352 delete m_charmInfo;
353 delete movespline;
354
357 ASSERT(m_attackers.empty());
358
359 // pussywizard: clear m_sharedVision along with back references
360 if (!m_sharedVision.empty())
361 {
362 do
363 {
364 Player* p = *(m_sharedVision.begin());
365 p->m_isInSharedVisionOf.erase(this);
366 m_sharedVision.remove(p);
367 } while (!m_sharedVision.empty());
368 }
369
370 ASSERT(m_Controlled.empty());
371 ASSERT(m_appliedAuras.empty());
372 ASSERT(m_ownedAuras.empty());
373 ASSERT(m_removedAuras.empty());
374 ASSERT(m_gameObj.empty());
375 ASSERT(m_dynObj.empty());
376
377 if (m_movedByPlayer && m_movedByPlayer != this)
378 LOG_INFO("misc", "Unit::~Unit (A1)");
379
381}
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:166
#define CURRENT_MAX_SPELL
Definition Unit.h:545
Definition Player.h:1083
std::set< Unit * > m_isInSharedVisionOf
Definition Player.h:2350
void SetReferencedFromCurrent(bool yes)
Definition Spell.h:563
bool m_duringRemoveFromWorld
Definition Unit.h:2166
Spell * m_currentSpells[CURRENT_MAX_SPELL]
Definition Unit.h:2078
AuraList m_removedAuras
Definition Unit.h:2082
ControlSet m_Controlled
Definition Unit.h:1990
Movement::MoveSpline * movespline
Definition Unit.h:2029
CharmInfo * m_charmInfo
Definition Unit.h:2099
MotionMaster * i_motionMaster
Definition Unit.h:2102
void _DeleteRemovedAuras()
Definition Unit.cpp:3863
DynObjectList m_dynObj
Definition Unit.h:2072
SafeUnitPointer m_movedByPlayer
Definition Unit.h:1992
AttackerSet m_attackers
Definition Unit.h:2064
Unit * m_attacking
Definition Unit.h:2065
GameObjectList m_gameObj
Definition Unit.h:2075
AuraMap m_ownedAuras
Definition Unit.h:2080
AuraApplicationMap m_appliedAuras
Definition Unit.h:2081
static void HandleSafeUnitPointersOnDelete(Unit *thisUnit)
Definition Unit.cpp:4385
SharedVisionList m_sharedVision
Definition Unit.h:2100

References _DeleteRemovedAuras(), ASSERT, CURRENT_MAX_SPELL, HandleSafeUnitPointersOnDelete(), i_motionMaster, LOG_INFO, m_appliedAuras, m_attackers, m_attacking, m_charmInfo, m_Controlled, m_currentSpells, m_duringRemoveFromWorld, m_dynObj, m_gameObj, Player::m_isInSharedVisionOf, m_movedByPlayer, m_ownedAuras, m_removedAuras, m_sharedVision, movespline, and Spell::SetReferencedFromCurrent().

◆ Unit()

Unit::Unit ( bool  isWorldObject)
explicitprotected
204 : WorldObject(isWorldObject),
205 m_movedByPlayer(nullptr),
207 IsAIEnabled(false),
208 NeedChangeAI(false),
210 m_CreatedByPlayer(false),
212 i_AI(nullptr),
213 i_disabledAI(nullptr),
214 m_realRace(0),
215 m_race(0),
217 m_procDeep(0),
219 i_motionMaster(new MotionMaster(this)),
220 m_regenTimer(0),
221 m_ThreatMgr(this),
222 m_vehicle(nullptr),
223 m_vehicleKit(nullptr),
225 m_HostileRefMgr(this),
226 m_comboTarget(nullptr),
228{
229#ifdef _MSC_VER
230#pragma warning(default:4355)
231#endif
234
236
243
244 m_canDualWield = false;
245
246 m_rootTimes = 0;
247
248 m_state = 0;
250
251 for (uint8 i = 0; i < CURRENT_MAX_SPELL; ++i)
252 m_currentSpells[i] = nullptr;
253
254 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
255 m_SummonSlot[i].Clear();
256
257 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
258 m_ObjectSlot[i].Clear();
259
261
262 m_interruptMask = 0;
263 m_transform = 0;
264 m_canModifyStats = false;
265
266 for (uint8 i = 0; i < MAX_SPELL_IMMUNITY; ++i)
267 m_spellImmune[i].clear();
268
269 for (uint8 i = 0; i < UNIT_MOD_END; ++i)
270 {
275 }
276 // implement 50% base damage from offhand
278
279 for (uint8 i = 0; i < MAX_ATTACK; ++i)
280 {
283
284 m_weaponDamage[i][MINDAMAGE][1] = 0.f;
285 m_weaponDamage[i][MAXDAMAGE][1] = 0.f;
286 }
287
288 for (uint8 i = 0; i < MAX_STATS; ++i)
289 m_createStats[i] = 0.0f;
290
291 m_attacking = nullptr;
292 m_modMeleeHitChance = 0.0f;
294 m_modSpellHitChance = 0.0f;
296
297 m_CombatTimer = 0;
298 m_lastManaUse = 0;
299
300 for (uint8 i = 0; i < MAX_SPELL_SCHOOL; ++i)
301 m_threatModifier[i] = 1.0f;
302
303 for (uint8 i = 0; i < MAX_MOVE_TYPE; ++i)
304 m_speed_rate[i] = 1.0f;
305
306 m_charmInfo = nullptr;
307
309
310 // remove aurastates allowing special moves
311 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
312 m_reactiveTimer[i] = 0;
313
314 m_cleanupDone = false;
316
318
319 m_last_notify_position.Relocate(-5000.0f, -5000.0f, -5000.0f, 0.0f);
324
325 m_applyResilience = false;
326 _instantCast = false;
327
328 _lastLiquid = nullptr;
329
330 _oldFactionId = 0;
331
332 _isWalkingBeforeCharm = false;
333
335}
@ TYPEID_UNIT
Definition ObjectGuid.h:35
@ TYPEMASK_UNIT
Definition ObjectGuid.h:49
@ SERVERSIDE_VISIBILITY_GHOST
Definition SharedDefines.h:1274
#define MAX_STATS
Definition SharedDefines.h:265
constexpr auto MAX_SPELL_SCHOOL
Definition SharedDefines.h:292
@ MAX_SUMMON_SLOT
Definition SharedDefines.h:3558
@ GHOST_VISIBILITY_ALIVE
Definition SharedDefines.h:1281
#define MAX_GAMEOBJECT_SLOT
Definition SharedDefines.h:3562
#define MAX_SPELL_IMMUNITY
Definition SharedDefines.h:1404
@ UNIT_MASK_NONE
Definition UnitDefines.h:155
#define MAX_MOVE_TYPE
Definition UnitDefines.h:360
@ MINDAMAGE
Definition Unit.h:136
@ MAXDAMAGE
Definition Unit.h:137
@ UNIT_MOD_DAMAGE_OFFHAND
Definition Unit.h:167
@ UNIT_MOD_END
Definition Unit.h:169
@ OFF_ATTACK
Definition Unit.h:211
@ MAX_ATTACK
Definition Unit.h:213
@ BASE_ATTACK
Definition Unit.h:210
@ RANGED_ATTACK
Definition Unit.h:212
@ BASE_VALUE
Definition Unit.h:127
@ TOTAL_VALUE
Definition Unit.h:129
@ TOTAL_PCT
Definition Unit.h:130
@ BASE_PCT
Definition Unit.h:128
#define BASE_MAXDAMAGE
Definition Unit.h:41
@ MAX_REACTIVE
Definition Unit.h:600
#define BASE_MINDAMAGE
Definition Unit.h:40
@ UPDATEFLAG_LIVING
Definition UpdateData.h:44
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:45
void SetValue(FLAG_TYPE flag, T_VALUES value)
Definition Object.h:384
Definition MotionMaster.h:112
Definition MoveSpline.h:40
uint16 m_objectType
Definition Object.h:252
uint16 m_updateFlag
Definition Object.h:255
TypeID m_objectTypeId
Definition Object.h:254
uint32 m_reactiveTimer[MAX_REACTIVE]
Definition Unit.h:2104
uint32 m_lastSanctuaryTime
Definition Unit.h:2006
LiquidTypeEntry const * _lastLiquid
Definition Unit.h:2115
uint32 m_transform
Definition Unit.h:2076
uint32 m_CombatTimer
Definition Unit.h:2149
bool m_canModifyStats
Definition Unit.h:2094
UnitAI * i_disabledAI
Definition Unit.h:2053
bool NeedChangeAI
Definition Unit.h:2013
uint32 m_state
Definition Unit.h:2148
float m_auraModifiersGroup[UNIT_MOD_END][MODIFIER_TYPE_END]
Definition Unit.h:2092
int32 m_attackTimer[MAX_ATTACK]
Definition Unit.h:2060
float m_modAttackSpeedPct[3]
Definition Unit.h:2003
uint8 m_realRace
Definition Unit.h:2055
Vehicle * m_vehicle
Definition Unit.h:2111
uint32 m_rootTimes
Definition Unit.h:2121
uint8 m_race
Definition Unit.h:2056
UnitAI * i_AI
Definition Unit.h:2052
uint32 _lastExtraAttackSpell
Definition Unit.h:2171
bool _instantCast
Definition Unit.h:2119
ObjectGuid m_ObjectSlot[MAX_GAMEOBJECT_SLOT]
Definition Unit.h:1995
RedirectThreatInfo _redirectThreatInfo
Definition Unit.h:2163
float m_createStats[MAX_STATS]
Definition Unit.h:2062
float m_modRangedHitChance
Definition Unit.h:1998
DeathState m_deathState
Definition Unit.h:2067
uint32 m_unitTypeMask
Definition Unit.h:2114
uint32 m_removedAurasCount
Definition Unit.h:2084
ThreatMgr m_ThreatMgr
Definition Unit.h:2107
Unit * m_comboTarget
Definition Unit.h:2159
AuraMap::iterator m_auraUpdateIterator
Definition Unit.h:2083
bool m_AutoRepeatFirstCast
Definition Unit.h:2058
uint16 m_delayed_unit_ai_notify_timer
Definition Unit.h:2025
int32 m_regenTimer
Definition Unit.h:2105
bool bRequestForcedVisibilityUpdate
Definition Unit.h:2026
bool m_ControlledByPlayer
Definition Unit.h:2015
uint32 m_last_notify_mstime
Definition Unit.h:2023
SpellImmuneList m_spellImmune[MAX_SPELL_IMMUNITY]
Definition Unit.h:2005
int8 m_comboPoints
Definition Unit.h:2160
uint32 _oldFactionId
faction before charm
Definition Unit.h:2168
int32 m_baseSpellCritChance
Definition Unit.h:2000
float m_modMeleeHitChance
Definition Unit.h:1997
float m_weaponDamage[MAX_ATTACK][MAX_WEAPON_DAMAGE_RANGE][MAX_ITEM_PROTO_DAMAGES]
Definition Unit.h:2093
Position m_last_notify_position
Definition Unit.h:2022
Vehicle * m_vehicleKit
Definition Unit.h:2112
bool IsAIEnabled
Definition Unit.h:2012
HostileRefMgr m_HostileRefMgr
Definition Unit.h:2155
bool m_applyResilience
Definition Unit.h:2118
bool m_canDualWield
Definition Unit.h:1988
uint32 m_interruptMask
Definition Unit.h:2090
int32 m_procDeep
Definition Unit.h:2069
float m_speed_rate[MAX_MOVE_TYPE]
Definition Unit.h:2097
float m_modSpellHitChance
Definition Unit.h:1999
ObjectGuid m_SummonSlot[MAX_SUMMON_SLOT]
Definition Unit.h:1994
bool m_cleanupDone
Definition Unit.h:2165
bool _isWalkingBeforeCharm
Are we walking before we were charmed?
Definition Unit.h:2169
bool m_CreatedByPlayer
Definition Unit.h:2016
uint16 m_delayed_unit_relocation_timer
Definition Unit.h:2024
float m_threatModifier[MAX_SPELL_SCHOOL]
Definition Unit.h:2002
uint32 m_lastManaUse
Definition Unit.h:2150
Definition Object.h:461
FlaggedValuesArray32< int32, uint32, ServerSideVisibilityType, TOTAL_SERVERSIDE_VISIBILITY_TYPES > m_serverSideVisibility
Definition Object.h:579
void Relocate(float x, float y)
Definition Position.h:77
Definition ThreatMgr.h:293

References _instantCast, _isWalkingBeforeCharm, _lastExtraAttackSpell, _lastLiquid, _oldFactionId, _redirectThreatInfo, Alive, BASE_ATTACK, BASE_MAXDAMAGE, BASE_MINDAMAGE, BASE_PCT, BASE_VALUE, bRequestForcedVisibilityUpdate, CURRENT_MAX_SPELL, GHOST_VISIBILITY_ALIVE, m_applyResilience, m_attacking, m_attackTimer, m_auraModifiersGroup, m_auraUpdateIterator, m_baseSpellCritChance, m_canDualWield, m_canModifyStats, m_charmInfo, m_cleanupDone, m_CombatTimer, m_createStats, m_currentSpells, m_deathState, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_duringRemoveFromWorld, m_interruptMask, m_last_notify_mstime, m_last_notify_position, m_lastManaUse, m_modAttackSpeedPct, m_modMeleeHitChance, m_modRangedHitChance, m_modSpellHitChance, m_ObjectSlot, Object::m_objectType, Object::m_objectTypeId, m_ownedAuras, m_reactiveTimer, m_rootTimes, WorldObject::m_serverSideVisibility, m_speed_rate, m_spellImmune, m_state, m_SummonSlot, m_threatModifier, m_transform, Object::m_updateFlag, m_weaponDamage, MAX_ATTACK, MAX_GAMEOBJECT_SLOT, MAX_MOVE_TYPE, MAX_REACTIVE, MAX_SPELL_IMMUNITY, MAX_SPELL_SCHOOL, MAX_STATS, MAX_SUMMON_SLOT, MAXDAMAGE, MINDAMAGE, OFF_ATTACK, RANGED_ATTACK, Position::Relocate(), SERVERSIDE_VISIBILITY_GHOST, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), TOTAL_PCT, TOTAL_VALUE, TYPEID_UNIT, TYPEMASK_UNIT, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_END, UPDATEFLAG_LIVING, and UPDATEFLAG_STATIONARY_POSITION.

Member Function Documentation

◆ _addAttacker()

void Unit::_addAttacker ( Unit pAttacker)
inlineprivate
2144{ m_attackers.insert(pAttacker); }

References m_attackers.

Referenced by Attack().

◆ _AddAura()

void Unit::_AddAura ( UnitAura aura,
Unit caster 
)
4471{
4473 m_ownedAuras.insert(AuraMap::value_type(aura->GetId(), aura));
4474
4476
4477 if (aura->IsRemoved())
4478 return;
4479
4481 if (aura->IsSingleTarget())
4482 {
4483 ASSERT((IsInWorld() && !IsDuringRemoveFromWorld()) || (aura->GetCasterGUID() == GetGUID()));
4484 /* @HACK: Player is not in world during loading auras.
4485 * Single target auras are not saved or loaded from database
4486 * but may be created as a result of aura links (player mounts with passengers)
4487 */
4488
4489 // register single target aura
4490 caster->GetSingleCastAuras().push_back(aura);
4491 // remove other single target auras
4492 Unit::AuraList& scAuras = caster->GetSingleCastAuras();
4493 for (Unit::AuraList::iterator itr = scAuras.begin(); itr != scAuras.end();)
4494 {
4495 if ((*itr) != aura &&
4496 (*itr)->IsSingleTargetWith(aura))
4497 {
4498 (*itr)->Remove();
4499 itr = scAuras.begin();
4500 }
4501 else
4502 ++itr;
4503 }
4504 }
4505}
@ SPELL_AURA_CONTROL_VEHICLE
Definition SpellAuraDefines.h:299
ObjectGuid GetCasterGUID() const
Definition SpellAuras.h:105
bool IsRemoved() const
Definition SpellAuras.h:161
bool IsSingleTargetWith(Aura const *aura) const
Definition SpellAuras.cpp:1142
uint32 GetId() const
Definition SpellAuras.cpp:466
bool HasEffectType(AuraType type) const
Definition SpellAuras.cpp:1222
SpellInfo const * GetSpellInfo() const
Definition SpellAuras.h:100
void SetIsSingleTarget(bool val)
Definition SpellAuras.h:166
bool IsSingleTarget() const
Definition SpellAuras.h:164
bool IsInWorld() const
Definition Object.h:108
ObjectGuid GetGUID() const
Definition Object.h:114
bool IsSingleTarget() const
Definition SpellInfo.cpp:1374
void _RemoveNoStackAurasDueToAura(Aura *aura)
Definition Unit.cpp:4723
std::list< Aura * > AuraList
Definition Unit.h:637
bool IsDuringRemoveFromWorld() const
Definition Unit.h:658
AuraList & GetSingleCastAuras()
Definition Unit.h:1352

References _RemoveNoStackAurasDueToAura(), ASSERT, Aura::GetCasterGUID(), Object::GetGUID(), Aura::GetId(), GetSingleCastAuras(), Aura::GetSpellInfo(), Aura::HasEffectType(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Aura::IsRemoved(), Aura::IsSingleTarget(), SpellInfo::IsSingleTarget(), Aura::IsSingleTargetWith(), m_cleanupDone, m_ownedAuras, Aura::SetIsSingleTarget(), and SPELL_AURA_CONTROL_VEHICLE.

Referenced by UnitAura::UnitAura().

◆ _ApplyAllAuraStatMods()

void Unit::_ApplyAllAuraStatMods ( )
5545{
5546 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5547 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, true);
5548}
@ AURA_EFFECT_HANDLE_STAT
Definition SpellAuraDefines.h:46

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_ApplyAllStatBonuses().

◆ _ApplyAura()

void Unit::_ApplyAura ( AuraApplication aurApp,
uint8  effMask 
)
4562{
4563 Aura* aura = aurApp->GetBase();
4564
4566
4567 if (aurApp->GetRemoveMode())
4568 return;
4569
4570 Unit* caster = aura->GetCaster();
4571
4572 // Update target aura state flag
4573 SpellInfo const* spellInfo = aura->GetSpellInfo();
4574 if (AuraStateType aState = spellInfo->GetAuraState())
4575 {
4576 uint32 aStateMask = (1 << (aState - 1));
4577 // force update so the new caster registers it
4578 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) && HasFlag(UNIT_FIELD_AURASTATE, aStateMask))
4580 else
4581 ModifyAuraState(aState, true);
4582 }
4583
4584 if (aurApp->GetRemoveMode())
4585 return;
4586
4587 // Sitdown on apply aura req seated
4590
4591 if (aurApp->GetRemoveMode())
4592 return;
4593
4594 aura->HandleAuraSpecificMods(aurApp, caster, true, false);
4595
4596 // apply effects of the aura
4597 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4598 {
4599 if (effMask & 1 << i && (!aurApp->GetRemoveMode()))
4600 aurApp->_HandleEffect(i, true);
4601 }
4602
4603 sScriptMgr->OnAuraApply(this, aura);
4604}
#define MAX_SPELL_EFFECTS
Definition DBCStructure.h:1638
std::uint32_t uint32
Definition Define.h:107
#define sScriptMgr
Definition ScriptMgr.h:727
#define PER_CASTER_AURA_STATE_MASK
Definition SharedDefines.h:1318
AuraStateType
Definition SharedDefines.h:1288
@ AURA_INTERRUPT_FLAG_NOT_SEATED
Definition SpellDefines.h:61
@ UNIT_STAND_STATE_SIT
Definition UnitDefines.h:33
@ UNIT_FIELD_AURASTATE
Definition UpdateFields.h:119
void _HandleEffect(uint8 effIndex, bool apply)
Definition SpellAuras.cpp:161
Aura * GetBase() const
Definition SpellAuras.h:62
AuraRemoveMode GetRemoveMode() const
Definition SpellAuras.h:73
Definition SpellAuras.h:87
Unit * GetCaster() const
Definition SpellAuras.cpp:471
void HandleAuraSpecificMods(AuraApplication const *aurApp, Unit *caster, bool apply, bool onReapply)
Definition SpellAuras.cpp:1265
bool HasFlag(uint16 index, uint32 flag) const
Definition Object.cpp:889
void ForceValuesUpdateAtIndex(uint32)
Definition Object.cpp:2060
Definition SpellInfo.h:316
AuraStateType GetAuraState() const
Definition SpellInfo.cpp:2071
uint32 AuraInterruptFlags
Definition SpellInfo.h:353
Definition Unit.h:620
void ModifyAuraState(AuraStateType flag, bool apply)
Definition Unit.cpp:10583
void SetStandState(uint8 state)
Definition Unit.cpp:16798
bool IsSitState() const
Definition Unit.cpp:16783

References AuraApplication::_HandleEffect(), _RemoveNoStackAurasDueToAura(), AURA_INTERRUPT_FLAG_NOT_SEATED, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), Aura::HandleAuraSpecificMods(), Object::HasFlag(), IsSitState(), MAX_SPELL_EFFECTS, ModifyAuraState(), PER_CASTER_AURA_STATE_MASK, SetStandState(), sScriptMgr, UNIT_FIELD_AURASTATE, and UNIT_STAND_STATE_SIT.

Referenced by _ApplyAuraEffect().

◆ _ApplyAuraEffect()

void Unit::_ApplyAuraEffect ( Aura aura,
uint8  effIndex 
)
4548{
4549 ASSERT(aura);
4550 ASSERT(aura->HasEffect(effIndex));
4552 ASSERT(aurApp);
4553 if (!aurApp->GetEffectMask())
4554 _ApplyAura(aurApp, 1 << effIndex);
4555 else
4556 aurApp->_HandleEffect(effIndex, true);
4557}
Definition SpellAuras.h:37
uint8 GetEffectMask() const
Definition SpellAuras.h:66
bool HasEffect(uint8 effIndex) const
Definition SpellAuras.h:173
const AuraApplication * GetApplicationOfTarget(ObjectGuid guid) const
Definition SpellAuras.h:183
void _ApplyAura(AuraApplication *aurApp, uint8 effMask)
Definition Unit.cpp:4561

References _ApplyAura(), AuraApplication::_HandleEffect(), ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetEffectMask(), Object::GetGUID(), and Aura::HasEffect().

◆ _CreateAuraApplication()

AuraApplication * Unit::_CreateAuraApplication ( Aura aura,
uint8  effMask 
)
4510{
4511 // can't apply aura on unit which is going to be deleted - to not create a memory leak
4513 // aura musn't be removed
4514 ASSERT(!aura->IsRemoved());
4515
4516 // aura mustn't be already applied on target
4517 ASSERT (!aura->IsAppliedOnTarget(GetGUID()) && "Unit::_CreateAuraApplication: aura musn't be applied on target");
4518
4519 SpellInfo const* aurSpellInfo = aura->GetSpellInfo();
4520 uint32 aurId = aurSpellInfo->Id;
4521
4522 // ghost spell check, allow apply any auras at player loading in ghost mode (will be cleanup after load)
4523 // Xinef: Added IsAllowingDeadTarget check
4524 if (!IsAlive() && !aurSpellInfo->IsDeathPersistent() && !aurSpellInfo->IsAllowingDeadTarget() && (!IsPlayer() || !ToPlayer()->GetSession()->PlayerLoading()))
4525 return nullptr;
4526
4527 Unit* caster = aura->GetCaster();
4528
4529 AuraApplication* aurApp = new AuraApplication(this, caster, aura, effMask);
4530 m_appliedAuras.insert(AuraApplicationMap::value_type(aurId, aurApp));
4531
4532 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4533 // xinef: even if it gets removed, it will be reapplied in a second
4534 if (aurSpellInfo->AuraInterruptFlags && this == aura->GetOwner())
4535 {
4536 m_interruptableAuras.push_back(aurApp);
4537 AddInterruptMask(aurSpellInfo->AuraInterruptFlags);
4538 }
4539
4540 if (AuraStateType aState = aura->GetSpellInfo()->GetAuraState())
4541 m_auraStateAuras.insert(AuraStateAurasMap::value_type(aState, aurApp));
4542
4543 aura->_ApplyForTarget(this, caster, aurApp);
4544 return aurApp;
4545}
WorldObject * GetOwner() const
Definition SpellAuras.h:107
bool IsAppliedOnTarget(ObjectGuid guid) const
Definition SpellAuras.h:185
virtual void _ApplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:492
bool IsPlayer() const
Definition Object.h:201
Player * ToPlayer()
Definition Object.h:202
bool IsDeathPersistent() const
Definition SpellInfo.cpp:1217
uint32 Id
Definition SpellInfo.h:320
bool IsAllowingDeadTarget() const
Definition SpellInfo.cpp:1227
void AddInterruptMask(uint32 mask)
Definition Unit.h:1523
bool IsAlive() const
Definition Unit.h:1707
AuraApplicationList m_interruptableAuras
Definition Unit.h:2088
AuraStateAurasMap m_auraStateAuras
Definition Unit.h:2089

References Aura::_ApplyForTarget(), AddInterruptMask(), ASSERT, SpellInfo::AuraInterruptFlags, SpellInfo::GetAuraState(), Aura::GetCaster(), Object::GetGUID(), Aura::GetOwner(), Aura::GetSpellInfo(), SpellInfo::Id, IsAlive(), SpellInfo::IsAllowingDeadTarget(), Aura::IsAppliedOnTarget(), SpellInfo::IsDeathPersistent(), Object::IsPlayer(), Aura::IsRemoved(), m_appliedAuras, m_auraStateAuras, m_cleanupDone, m_interruptableAuras, and Object::ToPlayer().

◆ _DeleteRemovedAuras()

void Unit::_DeleteRemovedAuras ( )
protected
3864{
3865 while (!m_removedAuras.empty())
3866 {
3867 delete m_removedAuras.front();
3868 m_removedAuras.pop_front();
3869 }
3870}

References m_removedAuras.

Referenced by _UpdateSpells(), and ~Unit().

◆ _EnterVehicle()

void Unit::_EnterVehicle ( Vehicle vehicle,
int8  seatId,
AuraApplication const *  aurApp = nullptr 
)
19474{
19475 // Must be called only from aura handler
19476 if (!IsAlive() || GetVehicleKit() == vehicle || vehicle->GetBase()->IsOnVehicle(this))
19477 return;
19478
19479 if (m_vehicle)
19480 {
19481 if (m_vehicle == vehicle)
19482 {
19483 if (seatId >= 0 && seatId != GetTransSeat())
19484 {
19485 LOG_DEBUG("vehicles", "EnterVehicle: {} leave vehicle {} seat {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), GetTransSeat(), seatId);
19486 ChangeSeat(seatId);
19487 }
19488
19489 return;
19490 }
19491 else
19492 {
19493 LOG_DEBUG("vehicles", "EnterVehicle: {} exit {} and enter {}.", GetEntry(), m_vehicle->GetBase()->GetEntry(), vehicle->GetBase()->GetEntry());
19494 ExitVehicle();
19495 }
19496 }
19497
19498 if (!aurApp || aurApp->GetRemoveMode())
19499 return;
19500
19501 if (Player* player = ToPlayer())
19502 {
19503 if (vehicle->GetBase()->IsPlayer() && player->IsInCombat())
19504 return;
19505
19506 sScriptMgr->AnticheatSetUnderACKmount(player);
19507
19509 player->StopCastingCharm();
19510 player->StopCastingBindSight();
19511 Dismount();
19513
19514 // drop flag at invisible in bg
19515 if (Battleground* bg = player->GetBattleground())
19516 bg->EventPlayerDroppedFlag(player);
19517
19519 player->GetSession()->SendPacket(&data);
19520 }
19521
19522 ASSERT(!m_vehicle);
19523 m_vehicle = vehicle;
19524
19525 if (!m_vehicle->AddPassenger(this, seatId))
19526 {
19527 m_vehicle = nullptr;
19528 return;
19529 }
19530
19531 // Xinef: remove movement auras when entering vehicle (food buffs etc)
19533}
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
@ SPELL_AURA_MOUNTED
Definition SpellAuraDefines.h:141
@ AURA_INTERRUPT_FLAG_MOVE
Definition SpellDefines.h:46
@ AURA_INTERRUPT_FLAG_TURNING
Definition SpellDefines.h:47
Definition Battleground.h:294
uint32 GetEntry() const
Definition Object.h:116
void InterruptNonMeleeSpells(bool withDelayed, uint32 spellid=0, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4176
void Dismount()
Definition Unit.cpp:13607
bool IsOnVehicle(Unit const *vehicle) const
Definition Unit.h:1840
void RemoveAurasByType(AuraType auraType, ObjectGuid casterGUID=ObjectGuid::Empty, Aura *except=nullptr, bool negative=true, bool positive=true)
Definition Unit.cpp:5166
void ChangeSeat(int8 seatId, bool next=true)
Definition Unit.cpp:19535
Vehicle * GetVehicleKit() const
Definition Unit.h:1838
void RemoveAurasWithInterruptFlags(uint32 flag, uint32 except=0, bool isAutoshot=false)
Definition Unit.cpp:5237
void ExitVehicle(Position const *exitPosition=nullptr)
Definition Unit.cpp:19554
Unit * GetBase() const
May be called from scripts.
Definition Vehicle.h:37
bool AddPassenger(Unit *passenger, int8 seatId=-1)
Definition Vehicle.cpp:318
int8 GetTransSeat() const
Definition Object.h:654
Definition WorldPacket.h:26
@ SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA
Definition Opcodes.h:1211

References Vehicle::AddPassenger(), ASSERT, AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, ChangeSeat(), Dismount(), ExitVehicle(), Vehicle::GetBase(), Object::GetEntry(), AuraApplication::GetRemoveMode(), WorldObject::GetTransSeat(), GetVehicleKit(), InterruptNonMeleeSpells(), IsAlive(), IsOnVehicle(), Object::IsPlayer(), LOG_DEBUG, m_vehicle, RemoveAurasByType(), RemoveAurasWithInterruptFlags(), SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SPELL_AURA_MOUNTED, sScriptMgr, and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraControlVehicle().

◆ _ExitVehicle()

void Unit::_ExitVehicle ( Position const *  exitPosition = nullptr)
19592{
19593 if (!m_vehicle)
19594 return;
19595
19596 // This should be done before dismiss, because there may be some aura removal
19599
19600 Player* player = ToPlayer();
19601
19602 // If player is on mouted duel and exits the mount should immediatly lose the duel
19603 if (player && player->duel && player->duel->IsMounted)
19604 player->DuelComplete(DUEL_FLED);
19605
19606 Vehicle* vehicle = m_vehicle;
19607 Unit* vehicleBase = m_vehicle->GetBase();
19608 m_vehicle = nullptr;
19609
19610 if (!vehicleBase)
19611 return;
19612
19613 SetControlled(false, UNIT_STATE_ROOT); // SMSG_MOVE_FORCE_UNROOT, ~MOVEMENTFLAG_ROOT
19614
19615 Position pos;
19616 // If we ask for a specific exit position, use that one. Otherwise allow scripts to modify it
19617 if (exitPosition)
19618 pos = *exitPosition;
19619 else
19620 {
19621 // Set exit position to vehicle position and use the current orientation
19622 pos = vehicleBase->GetPosition(); // This should use passenger's current position, leaving it as it is now
19623 pos.SetOrientation(vehicleBase->GetOrientation());
19624
19625 // Change exit position based on seat entry addon data
19626 if (seatAddon)
19627 {
19629 pos.RelocateOffset({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19631 pos.Relocate({ seatAddon->ExitParameterX, seatAddon->ExitParameterY, seatAddon->ExitParameterZ, seatAddon->ExitParameterO });
19632 }
19633 }
19634
19636
19637 if (player)
19638 {
19640
19641 sScriptMgr->AnticheatSetUnderACKmount(player);
19642 }
19644 {
19646 data << GetPackGUID();
19647 SendMessageToSet(&data, false);
19648 }
19649
19650 // xinef: hack for flameleviathan seat vehicle
19651 VehicleEntry const* vehicleInfo = vehicle->GetVehicleInfo();
19652 if (!vehicleInfo || vehicleInfo->m_ID != 341)
19653 {
19654 Movement::MoveSplineInit init(this);
19655 init.MoveTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ());
19656 init.SetFacing(vehicleBase->GetOrientation());
19657 init.SetTransportExit();
19658 init.Launch();
19659 }
19660 else
19661 {
19662 float o = pos.GetAngle(this);
19663 Movement::MoveSplineInit init(this);
19664 init.MoveTo(pos.GetPositionX() + 8 * cos(o), pos.GetPositionY() + 8 * std::sin(o), pos.GetPositionZ() + 16.0f);
19665 init.SetFacing(GetOrientation());
19666 init.SetTransportExit();
19667 init.Launch();
19668 DisableSpline();
19669 KnockbackFrom(pos.GetPositionX(), pos.GetPositionY(), 10.0f, 20.0f);
19671 }
19672
19673 // xinef: move fall, should we support all creatures that exited vehicle in air? Currently Quest Drag and Drop only, Air Assault quest
19674 if (IsCreature() && !CanFly() && vehicleInfo && (vehicleInfo->m_ID == 113 || vehicleInfo->m_ID == 8 || vehicleInfo->m_ID == 290 || vehicleInfo->m_ID == 298))
19675 {
19677 }
19678
19679 if ((!player || !(player->GetDelayedOperations() & DELAYED_VEHICLE_TELEPORT)) && vehicle->GetBase()->HasUnitTypeMask(UNIT_MASK_MINION))
19680 if (((Minion*)vehicleBase)->GetOwner() == this)
19681 {
19682 if (!vehicleInfo || vehicleInfo->m_ID != 349)
19683 {
19684 vehicle->Dismiss();
19685 }
19686 else if (vehicleBase->IsCreature())
19687 {
19688 vehicle->Uninstall();
19689 vehicleBase->m_Events.AddEvent(new VehicleDespawnEvent(*vehicleBase, 2000), vehicleBase->m_Events.CalculateTime(2000));
19690 }
19691
19692 // xinef: ugly hack, no appripriate hook later to cast spell
19693 if (player)
19694 {
19695 if (vehicleBase->GetEntry() == NPC_EIDOLON_WATCHER)
19696 player->CastSpell(player, VEHICLE_SPELL_SHADE_CONTROL_END, true);
19697 else if (vehicleBase->GetEntry() == NPC_LITHE_STALKER)
19698 player->CastSpell(player, VEHICLE_SPELL_GEIST_CONTROL_END, true);
19699 }
19700 }
19701
19703 {
19704 // Vehicle just died, we die too
19705 if (vehicleBase->getDeathState() == DeathState::JustDied)
19707 // If for other reason we as minion are exiting the vehicle (ejected, master dismounted) - unsummon
19708 else
19709 ToTempSummon()->UnSummon(2000); // Approximation
19710 }
19711
19712 if (player)
19713 {
19715 player->SetCanTeleport(true);
19716 }
19717}
@ DELAYED_VEHICLE_TELEPORT
Definition Player.h:916
@ DUEL_FLED
Definition SharedDefines.h:3869
@ MOVEMENTFLAG_ROOT
Definition UnitDefines.h:376
@ UNIT_MASK_ACCESSORY
Definition UnitDefines.h:165
@ UNIT_MASK_MINION
Definition UnitDefines.h:157
@ UNIT_STATE_ROOT
Definition UnitDefines.h:180
@ UNIT_STATE_MOVE
Definition UnitDefines.h:189
@ VEHICLE_SPELL_PARACHUTE
Definition VehicleDefines.h:53
@ VEHICLE_SPELL_SHADE_CONTROL_END
Definition VehicleDefines.h:56
@ VEHICLE_SPELL_GEIST_CONTROL_END
Definition VehicleDefines.h:55
@ NPC_EIDOLON_WATCHER
Definition VehicleDefines.h:69
@ NPC_LITHE_STALKER
Definition VehicleDefines.h:70
void AddEvent(BasicEvent *Event, uint64 e_time, bool set_addtime=true)
Definition EventProcessor.h:103
uint64 CalculateTime(uint64 t_offset) const
Definition EventProcessor.cpp:159
Definition TemporarySummon.h:77
void MoveFall(uint32 id=0, bool addFlagForNPC=false)
The unit will fall. Used when in the air. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:627
Definition MoveSplineInit.h:71
PackedGuid const & GetPackGUID() const
Definition Object.h:115
bool IsCreature() const
Definition Object.h:205
void SetCanTeleport(bool value)
Definition Player.h:2513
void DuelComplete(DuelCompleteType type)
Definition Player.cpp:6451
void SetFallInformation(uint32 time, float z)
Definition Player.h:2351
std::unique_ptr< DuelInfo > duel
Definition Player.h:1891
void ResummonPetTemporaryUnSummonedIfAny()
Definition Player.cpp:14209
uint32 GetDelayedOperations() const
Definition Player.h:2113
virtual void UnSummon(uint32 msTime=0)
Definition TemporarySummon.cpp:287
virtual void setDeathState(DeathState s, bool despawn=false)
Definition Unit.cpp:14643
Unit * GetOwner() const
Definition Unit.cpp:10686
DeathState getDeathState()
Definition Unit.h:1704
virtual bool CanFly() const =0
MotionMaster * GetMotionMaster()
Definition Unit.h:1673
TempSummon * ToTempSummon()
Definition Unit.h:686
void DisableSpline()
Definition Unit.cpp:637
void AddUnitState(uint32 f)
Definition Unit.h:690
void SetControlled(bool apply, UnitState state, Unit *source=nullptr, bool isFear=false)
Definition Unit.cpp:18120
bool HasUnitMovementFlag(uint32 f) const
Definition Unit.h:729
SpellCastResult CastSpell(SpellCastTargets const &targets, SpellInfo const *spellInfo, CustomSpellValues const *value, TriggerCastFlags triggerFlags=TRIGGERED_NONE, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1193
uint32 HasUnitTypeMask(uint32 mask) const
Definition Unit.h:696
void KnockbackFrom(float x, float y, float speedXY, float speedZ)
Definition Unit.cpp:19229
Definition Vehicle.h:101
Definition Vehicle.h:28
void Dismiss()
Definition Vehicle.cpp:539
VehicleEntry const * GetVehicleInfo() const
Definition Vehicle.h:38
void RemovePassenger(Unit *passenger)
Definition Vehicle.cpp:460
void Uninstall()
Definition Vehicle.cpp:101
VehicleSeatAddon const * GetSeatAddonForSeatOfPassenger(Unit const *passenger) const
Definition Vehicle.cpp:237
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:2073
EventProcessor m_Events
Definition Object.h:693
@ SMSG_SPLINE_MOVE_UNROOT
Definition Opcodes.h:802
Seconds GetGameTime()
Definition GameTime.cpp:38
Definition Position.h:27
void RelocateOffset(const Position &offset)
Definition Position.cpp:59
float GetPositionZ() const
Definition Position.h:123
float GetOrientation() const
Definition Position.h:124
void SetOrientation(float orientation)
Definition Position.h:116
float GetPositionX() const
Definition Position.h:121
void GetPosition(float &x, float &y) const
Definition Position.h:126
float GetPositionY() const
Definition Position.h:122
float GetAngle(const Position *pos) const
Definition Position.cpp:78
Definition DBCStructure.h:2028
uint32 m_ID
Definition DBCStructure.h:2029
Definition VehicleDefines.h:86
float ExitParameterO
Definition VehicleDefines.h:96
float ExitParameterX
Definition VehicleDefines.h:93
float ExitParameterY
Definition VehicleDefines.h:94
float ExitParameterZ
Definition VehicleDefines.h:95
VehicleExitParameters ExitParameter
Definition VehicleDefines.h:97

References EventProcessor::AddEvent(), AddUnitState(), EventProcessor::CalculateTime(), CanFly(), CastSpell(), DELAYED_VEHICLE_TELEPORT, DisableSpline(), Vehicle::Dismiss(), Player::duel, DUEL_FLED, Player::DuelComplete(), VehicleSeatAddon::ExitParameter, VehicleSeatAddon::ExitParameterO, VehicleSeatAddon::ExitParameterX, VehicleSeatAddon::ExitParameterY, VehicleSeatAddon::ExitParameterZ, Position::GetAngle(), Vehicle::GetBase(), getDeathState(), Player::GetDelayedOperations(), Object::GetEntry(), GameTime::GetGameTime(), GetMotionMaster(), Position::GetOrientation(), GetOwner(), Object::GetPackGUID(), Position::GetPosition(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Vehicle::GetSeatAddonForSeatOfPassenger(), Vehicle::GetVehicleInfo(), HasUnitMovementFlag(), HasUnitTypeMask(), Object::IsCreature(), JustDied, KnockbackFrom(), Movement::MoveSplineInit::Launch(), WorldObject::m_Events, VehicleEntry::m_ID, m_vehicle, MotionMaster::MoveFall(), MOVEMENTFLAG_ROOT, Movement::MoveSplineInit::MoveTo(), NPC_EIDOLON_WATCHER, NPC_LITHE_STALKER, Position::Relocate(), Position::RelocateOffset(), Vehicle::RemovePassenger(), Player::ResummonPetTemporaryUnSummonedIfAny(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SetControlled(), setDeathState(), Movement::MoveSplineInit::SetFacing(), Player::SetFallInformation(), Position::SetOrientation(), Movement::MoveSplineInit::SetTransportExit(), SMSG_SPLINE_MOVE_UNROOT, sScriptMgr, Object::ToPlayer(), ToTempSummon(), Vehicle::Uninstall(), UNIT_MASK_ACCESSORY, UNIT_MASK_MINION, UNIT_STATE_MOVE, UNIT_STATE_ROOT, TempSummon::UnSummon(), VEHICLE_SPELL_GEIST_CONTROL_END, VEHICLE_SPELL_PARACHUTE, VEHICLE_SPELL_SHADE_CONTROL_END, VehicleExitParamDest, and VehicleExitParamOffset.

Referenced by AuraEffect::HandleAuraControlVehicle(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ _IsNoStackAuraDueToAura()

bool Unit::_IsNoStackAuraDueToAura ( Aura appliedAura,
Aura existingAura 
) const

◆ _IsValidAssistTarget()

bool Unit::_IsValidAssistTarget ( Unit const *  target,
SpellInfo const *  bySpell 
) const
14091{
14092 ASSERT(target);
14093
14094 // can assist to self
14095 if (this == target)
14096 return true;
14097
14098 // can't assist unattackable units or GMs
14099 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
14100 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
14101 return false;
14102
14103 // can't assist own vehicle or passenger
14104 if (m_vehicle)
14105 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
14106 return false;
14107
14108 // can't assist invisible
14109 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && !CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()))
14110 return false;
14111
14112 // can't assist dead
14113 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
14114 return false;
14115
14116 // can't assist untargetable
14117 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
14118 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
14119 return false;
14120
14121 if (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14122 {
14123 // xinef: do not allow to assist non attackable units
14124 if (target->HasUnitFlag(UNIT_FLAG_NON_ATTACKABLE))
14125 return false;
14126
14128 {
14129 if (target->IsImmuneToPC())
14130 return false;
14131 }
14132 else
14133 {
14134 if (target->IsImmuneToNPC())
14135 return false;
14136 }
14137 }
14138
14139 // can't assist non-friendly targets
14140 if (GetReactionTo(target) < REP_NEUTRAL
14141 && target->GetReactionTo(this) < REP_NEUTRAL
14142 && (!ToCreature() || !(ToCreature()->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)))
14143 return false;
14144
14145 // PvP case
14146 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
14147 {
14148 Player const* targetPlayerOwner = target->GetAffectingPlayer();
14150 {
14151 Player const* selfPlayerOwner = GetAffectingPlayer();
14152 if (selfPlayerOwner && targetPlayerOwner)
14153 {
14154 // can't assist player which is dueling someone
14155 if (selfPlayerOwner != targetPlayerOwner
14156 && targetPlayerOwner->duel)
14157 return false;
14158 }
14159 // can't assist player in ffa_pvp zone from outside
14160 if (target->IsFFAPvP() && !IsFFAPvP())
14161 return false;
14162
14163 // can't assist player out of sanctuary from sanctuary if has pvp enabled
14164 if (target->IsPvP())
14165 if (IsInSanctuary() && !target->IsInSanctuary())
14166 return false;
14167 }
14168 }
14169 // PvC case - player can assist creature only if has specific type flags
14170 // !target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) &&
14172 && (!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC))
14173 && !target->IsPvP())
14174 {
14175 if (Creature const* creatureTarget = target->ToCreature())
14176 return creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT || creatureTarget->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_CAN_ASSIST;
14177 }
14178 return true;
14179}
@ REP_NEUTRAL
Definition SharedDefines.h:183
@ CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT
Definition SharedDefines.h:2721
@ CREATURE_TYPE_FLAG_CAN_ASSIST
Definition SharedDefines.h:2707
@ SPELL_ATTR6_CAN_TARGET_UNTARGETABLE
Definition SharedDefines.h:628
@ SPELL_ATTR6_IGNORE_PHASE_SHIFT
Definition SharedDefines.h:617
@ SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC
Definition SharedDefines.h:607
@ UNIT_STATE_UNATTACKABLE
Definition UnitDefines.h:207
@ UNIT_FLAG_NON_ATTACKABLE
Definition UnitDefines.h:251
@ UNIT_FLAG_NOT_SELECTABLE
Definition UnitDefines.h:275
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:253
Definition Creature.h:43
Creature * ToCreature()
Definition Object.h:206
ReputationRank GetReactionTo(Unit const *target, bool checkOriginalFaction=false) const
Definition Unit.cpp:10125
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:702
bool IsInSanctuary() const
Definition Unit.h:982
bool IsFFAPvP() const
Definition Unit.h:984
Player * GetAffectingPlayer() const
Definition Unit.cpp:10711
bool CanSeeOrDetect(WorldObject const *obj, bool ignoreStealth=false, bool distanceCheck=false, bool checkAlert=false) const
Definition Object.cpp:1719

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_CAN_ASSIST, CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, GetAffectingPlayer(), Vehicle::GetBase(), GetReactionTo(), SpellInfo::HasAttribute(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), IsFFAPvP(), Player::IsGameMaster(), IsImmuneToNPC(), IsImmuneToPC(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), m_vehicle, REP_NEUTRAL, SPELL_ATTR6_CAN_ASSIST_IMMUNE_PC, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_STATE_UNATTACKABLE.

Referenced by SpellInfo::CheckExplicitTarget(), IsValidAssistTarget(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _IsValidAttackTarget()

bool Unit::_IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell,
WorldObject const *  obj = nullptr 
) const
13968{
13969 ASSERT(target);
13970
13971 // can't attack self
13972 if (this == target)
13973 return false;
13974
13975 // can't attack unattackable units or GMs
13976 if (target->HasUnitState(UNIT_STATE_UNATTACKABLE)
13977 || (target->IsPlayer() && target->ToPlayer()->IsGameMaster()))
13978 return false;
13979
13980 // can't attack own vehicle or passenger
13981 if (m_vehicle)
13982 if (IsOnVehicle(target) || m_vehicle->GetBase()->IsOnVehicle(target))
13983 if (!IsHostileTo(target)) // pussywizard: actually can attack own vehicle or passenger if it's hostile to us - needed for snobold in Gormok encounter
13984 return false;
13985
13986 // can't attack invisible (ignore stealth for aoe spells) also if the area being looked at is from a spell use the dynamic object created instead of the casting unit.
13987 //Ignore stealth if target is player and unit in combat with same player
13988 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_IGNORE_PHASE_SHIFT)) && (obj ? !obj->CanSeeOrDetect(target, bySpell && bySpell->IsAffectingArea()) : !CanSeeOrDetect(target, (bySpell && bySpell->IsAffectingArea()) || (target->IsPlayer() && target->HasStealthAura() && target->IsInCombat() && IsInCombatWith(target)))))
13989 return false;
13990
13991 // can't attack dead
13992 if ((!bySpell || !bySpell->IsAllowingDeadTarget()) && !target->IsAlive())
13993 return false;
13994
13995 // can't attack untargetable
13996 if ((!bySpell || !bySpell->HasAttribute(SPELL_ATTR6_CAN_TARGET_UNTARGETABLE))
13997 && target->HasUnitFlag(UNIT_FLAG_NOT_SELECTABLE))
13998 return false;
13999
14000 if (Player const* playerAttacker = ToPlayer())
14001 {
14002 if (playerAttacker->HasPlayerFlag(PLAYER_FLAGS_UBER) || playerAttacker->IsSpectator())
14003 return false;
14004 }
14005 // check flags
14007 || (!HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToNPC())
14008 || (!target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToNPC())
14009 || (HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && target->IsImmuneToPC())
14010 // check if this is a world trigger cast - GOs are using world triggers to cast their spells, so we need to ignore their immunity flag here, this is a temp workaround, needs removal when go cast is implemented properly
14011 || ((GetEntry() != WORLD_TRIGGER && (!obj || !obj->isType(TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT))) && target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && IsImmuneToPC()))
14012 return false;
14013
14014 // CvC case - can attack each other only when one of them is hostile
14016 return GetReactionTo(target) <= REP_HOSTILE || target->GetReactionTo(this) <= REP_HOSTILE;
14017
14018 // PvP, PvC, CvP case
14019 // can't attack friendly targets
14020 ReputationRank repThisToTarget = GetReactionTo(target);
14021 ReputationRank repTargetToThis;
14022
14023 if (repThisToTarget > REP_NEUTRAL
14024 || (repTargetToThis = target->GetReactionTo(this)) > REP_NEUTRAL)
14025 return false;
14026
14027 // Not all neutral creatures can be attacked (even some unfriendly faction does not react aggresive to you, like Sporaggar)
14028 if (repThisToTarget == REP_NEUTRAL &&
14029 repTargetToThis <= REP_NEUTRAL)
14030 {
14031 Player* owner = GetAffectingPlayer();
14032 Unit const* const thisUnit = owner ? owner : this;
14033 if (!(target->IsPlayer() && thisUnit->IsPlayer()) &&
14034 !(target->IsCreature() && thisUnit->IsCreature()))
14035 {
14036 Player const* player = target->IsPlayer() ? target->ToPlayer() : thisUnit->ToPlayer();
14037 Unit const* creature = target->IsCreature() ? target : thisUnit;
14038
14039 if (FactionTemplateEntry const* factionTemplate = creature->GetFactionTemplateEntry())
14040 {
14041 if (!(player->GetReputationMgr().GetForcedRankIfAny(factionTemplate)))
14042 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplate->faction))
14043 if (FactionState const* repState = player->GetReputationMgr().GetState(factionEntry))
14044 if (!(repState->Flags & FACTION_FLAG_AT_WAR))
14045 return false;
14046 }
14047 }
14048 }
14049
14050 Creature const* creatureAttacker = ToCreature();
14051 if (creatureAttacker && creatureAttacker->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT)
14052 return false;
14053
14054 Player const* playerAffectingAttacker = HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? GetAffectingPlayer() : nullptr;
14055 Player const* playerAffectingTarget = target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) ? target->GetAffectingPlayer() : nullptr;
14056
14057 // check duel - before sanctuary checks
14058 if (playerAffectingAttacker && playerAffectingTarget)
14059 if (playerAffectingAttacker->duel && playerAffectingAttacker->duel->Opponent == playerAffectingTarget && playerAffectingAttacker->duel->State == DUEL_STATE_IN_PROGRESS)
14060 return true;
14061
14062 // PvP case - can't attack when attacker or target are in sanctuary
14063 // however, 13850 client doesn't allow to attack when one of the unit's has sanctuary flag and is pvp
14064 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED) && (target->IsInSanctuary() || IsInSanctuary()))
14065 return false;
14066
14067 // additional checks - only PvP case
14068 if (playerAffectingAttacker && playerAffectingTarget)
14069 {
14070 if (!IsPvP() && bySpell && bySpell->IsAffectingArea() && !bySpell->HasAttribute(SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK))
14071 return false;
14072
14073 if (target->IsPvP())
14074 return true;
14075
14076 if (IsFFAPvP() && target->IsFFAPvP())
14077 return true;
14078
14080 }
14081 return true;
14082}
@ FACTION_FLAG_AT_WAR
Definition DBCEnums.h:308
DBCStorage< FactionEntry > sFactionStore(FactionEntryfmt)
@ TYPEMASK_DYNAMICOBJECT
Definition ObjectGuid.h:52
@ TYPEMASK_GAMEOBJECT
Definition ObjectGuid.h:51
@ DUEL_STATE_IN_PROGRESS
Definition Player.h:378
@ PLAYER_FLAGS_UBER
Definition Player.h:499
@ SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK
Definition SharedDefines.h:573
ReputationRank
Definition SharedDefines.h:179
@ REP_HOSTILE
Definition SharedDefines.h:181
@ UNIT_BYTE2_FLAG_UNK1
Definition UnitDefines.h:137
@ UNIT_FLAG_TAXI_FLIGHT
Definition UnitDefines.h:270
@ UNIT_FLAG_NON_ATTACKABLE_2
Definition UnitDefines.h:266
@ UNIT_FLAG_NOT_ATTACKABLE_1
Definition UnitDefines.h:257
#define WORLD_TRIGGER
Definition Unit.h:38
@ UNIT_FIELD_BYTES_2
Definition UpdateFields.h:161
CreatureTemplate const * GetCreatureTemplate() const
Definition Creature.h:209
bool HasByteFlag(uint16 index, uint8 offset, uint8 flag) const
Definition Object.cpp:949
ReputationMgr & GetReputationMgr()
Definition Player.h:2140
FactionState const * GetState(FactionEntry const *factionEntry) const
Definition ReputationMgr.h:81
ReputationRank const * GetForcedRankIfAny(FactionTemplateEntry const *factionTemplateEntry) const
Definition ReputationMgr.h:106
FactionTemplateEntry const * GetFactionTemplateEntry() const
Definition Unit.cpp:10095
bool IsPvP() const
Definition Unit.h:983
bool HasStealthAura() const
Definition Unit.h:1755
bool IsInCombatWith(Unit const *who) const
Definition Unit.cpp:20895
bool IsImmuneToNPC() const
Definition Unit.h:874
bool IsHostileTo(Unit const *unit) const
Definition Unit.cpp:10297
bool IsImmuneToPC() const
Definition Unit.h:872
bool IsInCombat() const
Definition Unit.h:879
uint32 type_flags
Definition CreatureData.h:223
Definition DBCStructure.h:907
Definition ReputationMgr.h:41
Definition DBCStructure.h:939

References ASSERT, WorldObject::CanSeeOrDetect(), CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_FLAG_AT_WAR, GetAffectingPlayer(), Vehicle::GetBase(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetReactionTo(), Player::GetReputationMgr(), ReputationMgr::GetState(), SpellInfo::HasAttribute(), Object::HasByteFlag(), HasStealthAura(), HasUnitFlag(), HasUnitState(), SpellInfo::IsAffectingArea(), IsAlive(), SpellInfo::IsAllowingDeadTarget(), Object::IsCreature(), IsFFAPvP(), Player::IsGameMaster(), IsHostileTo(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsInCombatWith(), IsInSanctuary(), IsOnVehicle(), Object::IsPlayer(), IsPvP(), Object::isType(), m_vehicle, PLAYER_FLAGS_UBER, REP_HOSTILE, REP_NEUTRAL, sFactionStore, SPELL_ATTR5_IGNORE_AREA_EFFECT_PVP_CHECK, SPELL_ATTR6_CAN_TARGET_UNTARGETABLE, SPELL_ATTR6_IGNORE_PHASE_SHIFT, Object::ToCreature(), Object::ToPlayer(), CreatureTemplate::type_flags, TYPEMASK_DYNAMICOBJECT, TYPEMASK_GAMEOBJECT, UNIT_BYTE2_FLAG_UNK1, UNIT_FIELD_BYTES_2, UNIT_FLAG_NON_ATTACKABLE, UNIT_FLAG_NON_ATTACKABLE_2, UNIT_FLAG_NOT_ATTACKABLE_1, UNIT_FLAG_NOT_SELECTABLE, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_TAXI_FLIGHT, UNIT_STATE_UNATTACKABLE, and WORLD_TRIGGER.

Referenced by SpellInfo::CheckExplicitTarget(), Spell::DoSpellHitOnUnit(), GetMagicHitRedirectTarget(), GetMeleeHitRedirectTarget(), IsValidAttackTarget(), Acore::AnyAoETargetUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ _RegisterAuraEffect()

void Unit::_RegisterAuraEffect ( AuraEffect aurEff,
bool  apply 
)
4753{
4754 if (apply)
4755 m_modAuras[aurEff->GetAuraType()].push_back(aurEff);
4756 else
4757 m_modAuras[aurEff->GetAuraType()].erase(std::remove(m_modAuras[aurEff->GetAuraType()].begin(), m_modAuras[aurEff->GetAuraType()].end(), aurEff), m_modAuras[aurEff->GetAuraType()].end());
4758}
AuraType GetAuraType() const
Definition SpellAuraEffects.cpp:448
AuraEffectList m_modAuras[TOTAL_AURAS]
Definition Unit.h:2086

References AuraEffect::GetAuraType(), and m_modAuras.

Referenced by AuraEffect::HandleEffect().

◆ _RegisterDynObject()

void Unit::_RegisterDynObject ( DynamicObject dynObj)
6206{
6207 m_dynObj.push_back(dynObj);
6208}

References m_dynObj.

Referenced by DynamicObject::BindToCaster().

◆ _RemoveAllAuraStatMods()

void Unit::_RemoveAllAuraStatMods ( )
5539{
5540 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
5541 (*i).second->GetBase()->HandleAllEffects(i->second, AURA_EFFECT_HANDLE_STAT, false);
5542}

References AURA_EFFECT_HANDLE_STAT, and m_appliedAuras.

Referenced by Player::_RemoveAllStatBonuses().

◆ _removeAttacker()

void Unit::_removeAttacker ( Unit pAttacker)
inlineprivate
Note
: Call only in Unit::Attack()
2145{ m_attackers.erase(pAttacker); }

References m_attackers.

Referenced by Attack(), and AttackStop().

◆ _RemoveNoStackAuraApplicationsDueToAura()

void Unit::_RemoveNoStackAuraApplicationsDueToAura ( Aura aura)

◆ _RemoveNoStackAurasDueToAura()

void Unit::_RemoveNoStackAurasDueToAura ( Aura aura)
4724{
4725 //SpellInfo const* spellProto = aura->GetSpellInfo();
4726
4727 // passive spell special case (only non stackable with ranks)
4728
4729 // xinef: this check makes caster to have 2 area auras thanks to spec switch
4730 // if (spellProto->IsPassiveStackableWithRanks())
4731 // return;
4732
4733 bool remove = false;
4734 for (AuraApplicationMap::iterator i = m_appliedAuras.begin(); i != m_appliedAuras.end(); ++i)
4735 {
4736 if (remove)
4737 {
4738 remove = false;
4739 i = m_appliedAuras.begin();
4740 }
4741
4742 if (aura->CanStackWith(i->second->GetBase(), true))
4743 continue;
4744
4746 if (i == m_appliedAuras.end())
4747 break;
4748 remove = true;
4749 }
4750}
@ AURA_REMOVE_BY_DEFAULT
Definition SpellAuraDefines.h:392
bool CanStackWith(Aura const *checkAura, bool remove) const
Definition SpellAuras.cpp:2021
void RemoveAura(AuraApplicationMap::iterator &i, AuraRemoveMode mode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4832

References AURA_REMOVE_BY_DEFAULT, Aura::CanStackWith(), m_appliedAuras, and RemoveAura().

Referenced by _AddAura(), and _ApplyAura().

◆ _TryStackingOrRefreshingExistingAura()

Aura * Unit::_TryStackingOrRefreshingExistingAura ( SpellInfo const *  newAura,
uint8  effMask,
Unit caster,
int32 baseAmount = nullptr,
Item castItem = nullptr,
ObjectGuid  casterGUID = ObjectGuid::Empty,
bool  periodicReset = false 
)
4411{
4412 ASSERT(casterGUID || caster);
4413 if (!casterGUID)
4414 casterGUID = caster->GetGUID();
4415
4416 // Xinef: Hax for mixology, best solution qq
4417 if (sSpellMgr->GetSpellGroup(newAura->Id) == 1)
4418 return nullptr;
4419
4420 // passive and Incanter's Absorption and auras with different type can stack with themselves any number of times
4421 if (!newAura->IsMultiSlotAura())
4422 {
4423 // check if cast item changed
4424 ObjectGuid castItemGUID;
4425 if (castItem)
4426 castItemGUID = castItem->GetGUID();
4427
4428 // find current aura from spell and change it's stackamount, or refresh it's duration
4429 if (Aura* foundAura = GetOwnedAura(newAura->Id, newAura->HasAttribute(SPELL_ATTR0_CU_SINGLE_AURA_STACK) ? ObjectGuid::Empty : casterGUID, newAura->HasAttribute(SPELL_ATTR0_CU_ENCHANT_PROC) ? castItemGUID : ObjectGuid::Empty, 0))
4430 {
4431 // effect masks do not match
4432 // extremely rare case
4433 // let's just recreate aura
4434 if (effMask != foundAura->GetEffectMask())
4435 return nullptr;
4436
4437 // update basepoints with new values - effect amount will be recalculated in ModStackAmount
4438 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
4439 {
4440 if (!foundAura->HasEffect(i))
4441 continue;
4442
4443 int bp;
4444 if (baseAmount)
4445 bp = *(baseAmount + i);
4446 else
4447 bp = foundAura->GetSpellInfo()->Effects[i].BasePoints;
4448
4449 int32* oldBP = const_cast<int32*>(&(foundAura->GetEffect(i)->m_baseAmount));
4450 *oldBP = bp;
4451 }
4452
4453 // correct cast item guid if needed
4454 if (castItemGUID != foundAura->GetCastItemGUID())
4455 {
4456 ObjectGuid* oldGUID = const_cast<ObjectGuid*>(&foundAura->m_castItemGuid);
4457 *oldGUID = castItemGUID;
4458 }
4459
4460 // try to increase stack amount
4461 foundAura->ModStackAmount(1, AURA_REMOVE_BY_DEFAULT, periodicReset);
4462 sScriptMgr->OnAuraApply(this, foundAura);
4463 return foundAura;
4464 }
4465 }
4466
4467 return nullptr;
4468}
std::int32_t int32
Definition Define.h:103
@ SPELL_ATTR0_CU_ENCHANT_PROC
Definition SpellInfo.h:176
@ SPELL_ATTR0_CU_SINGLE_AURA_STACK
Definition SpellInfo.h:198
#define sSpellMgr
Definition SpellMgr.h:825
Definition ObjectGuid.h:118
static ObjectGuid const Empty
Definition ObjectGuid.h:120
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:113
Aura * GetOwnedAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, Aura *except=nullptr) const
Definition Unit.cpp:4816

References ASSERT, AURA_REMOVE_BY_DEFAULT, ObjectGuid::Empty, Object::GetGUID(), GetOwnedAura(), SpellInfo::HasAttribute(), SpellInfo::Id, SpellInfo::IsMultiSlotAura(), MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_ENCHANT_PROC, SPELL_ATTR0_CU_SINGLE_AURA_STACK, sScriptMgr, and sSpellMgr.

Referenced by Aura::TryRefreshStackOrCreate().

◆ _UnapplyAura() [1/2]

void Unit::_UnapplyAura ( AuraApplication aurApp,
AuraRemoveMode  removeMode 
)
4703{
4704 // aura can be removed from unit only if it's applied on it, shouldn't happen
4705 ASSERT(aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) == aurApp);
4706
4707 uint32 spellId = aurApp->GetBase()->GetId();
4708 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4709
4710 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4711 {
4712 if (iter->second == aurApp)
4713 {
4714 _UnapplyAura(iter, removeMode);
4715 return;
4716 }
4717 else
4718 ++iter;
4719 }
4720 ABORT();
4721}
#define ABORT
Definition Errors.h:76
std::pair< AuraApplicationMap::iterator, AuraApplicationMap::iterator > AuraApplicationMapBoundsNonConst
Definition Unit.h:631
void _UnapplyAura(AuraApplicationMap::iterator &i, AuraRemoveMode removeMode)
Definition Unit.cpp:4607

References _UnapplyAura(), ABORT, ASSERT, Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), and m_appliedAuras.

◆ _UnapplyAura() [2/2]

void Unit::_UnapplyAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  removeMode 
)
4608{
4609 AuraApplication* aurApp = i->second;
4610 ASSERT(aurApp);
4611 ASSERT(!aurApp->GetRemoveMode());
4612 ASSERT(aurApp->GetTarget() == this);
4613
4614 aurApp->SetRemoveMode(removeMode);
4615 Aura* aura = aurApp->GetBase();
4616 LOG_DEBUG("spells.aura", "Aura {} now is remove mode {}", aura->GetId(), removeMode);
4617
4618 // dead loop is killing the server probably
4619 ASSERT(m_removedAurasCount < 0xFFFFFFFF);
4620
4622
4623 Unit* caster = aura->GetCaster();
4624
4625 // Remove all pointers from lists here to prevent possible pointer invalidation on spellcast/auraapply/auraremove
4626 m_appliedAuras.erase(i);
4627
4628 // xinef: do not insert our application to interruptible list if application target is not the owner (area auras)
4629 // xinef: event if it gets removed, it will be reapplied in a second
4630 if (aura->GetSpellInfo()->AuraInterruptFlags && this == aura->GetOwner())
4631 {
4632 m_interruptableAuras.remove(aurApp);
4634 }
4635
4636 bool auraStateFound = false;
4637 AuraStateType auraState = aura->GetSpellInfo()->GetAuraState();
4638 if (auraState)
4639 {
4640 bool canBreak = false;
4641 // Get mask of all aurastates from remaining auras
4642 for (AuraStateAurasMap::iterator itr = m_auraStateAuras.lower_bound(auraState); itr != m_auraStateAuras.upper_bound(auraState) && !(auraStateFound && canBreak);)
4643 {
4644 if (itr->second == aurApp)
4645 {
4646 m_auraStateAuras.erase(itr);
4647 itr = m_auraStateAuras.lower_bound(auraState);
4648 canBreak = true;
4649 continue;
4650 }
4651 auraStateFound = true;
4652 ++itr;
4653 }
4654 }
4655
4656 aurApp->_Remove();
4657 aura->_UnapplyForTarget(this, caster, aurApp);
4658
4659 // remove effects of the spell - needs to be done after removing aura from lists
4660 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4661 {
4662 if (aurApp->HasEffect(itr))
4663 aurApp->_HandleEffect(itr, false);
4664 }
4665
4666 // all effect mustn't be applied
4667 ASSERT(!aurApp->GetEffectMask());
4668
4669 // Remove totem at next update if totem loses its aura
4670 if (aurApp->GetRemoveMode() == AURA_REMOVE_BY_EXPIRE && IsTotem() && GetGUID() == aura->GetCasterGUID())
4671 {
4672 if (ToTotem()->GetSpell() == aura->GetId() && ToTotem()->GetTotemType() == TOTEM_PASSIVE)
4674 }
4675
4676 // Remove aurastates only if needed and were not found
4677 if (auraState)
4678 {
4679 if (!auraStateFound)
4680 ModifyAuraState(auraState, false);
4681 else
4682 {
4683 // update for casters, some shouldn't 'see' the aura state
4684 uint32 aStateMask = (1 << (auraState - 1));
4685 if ((aStateMask & PER_CASTER_AURA_STATE_MASK) != 0)
4687 }
4688 }
4689
4690 aura->HandleAuraSpecificMods(aurApp, caster, false, false);
4691
4692 // only way correctly remove all auras from list
4693 //if (removedAuras != m_removedAurasCount) new aura may be added
4694 i = m_appliedAuras.begin();
4695
4696 sScriptMgr->OnAuraRemove(this, aurApp, removeMode);
4697
4698 if (this->ToCreature() && this->ToCreature()->IsAIEnabled)
4699 this->ToCreature()->AI()->OnAuraRemove(aurApp, removeMode);
4700}
@ AURA_REMOVE_BY_EXPIRE
Definition SpellAuraDefines.h:395
@ TOTEM_PASSIVE
Definition Totem.h:25
Unit * GetTarget() const
Definition SpellAuras.h:61
void SetRemoveMode(AuraRemoveMode mode)
Definition SpellAuras.h:72
void _Remove()
Definition SpellAuras.cpp:94
bool HasEffect(uint8 effect) const
Definition SpellAuras.h:67
virtual void _UnapplyForTarget(Unit *target, Unit *caster, AuraApplication *auraApp)
Definition SpellAuras.cpp:515
virtual void OnAuraRemove(AuraApplication *, AuraRemoveMode)
Definition CreatureAI.h:228
CreatureAI * AI() const
Definition Creature.h:141
void setDeathState(DeathState s, bool despawn=false) override
A creature can be in 4 different states: Alive, JustDied, Corpse, and JustRespawned....
Definition TemporarySummon.cpp:396
Totem * ToTotem()
Definition Unit.h:685
void UpdateInterruptMask()
Definition Unit.cpp:768
bool IsTotem() const
Definition Unit.h:749

References AuraApplication::_HandleEffect(), AuraApplication::_Remove(), Aura::_UnapplyForTarget(), Creature::AI(), ASSERT, AURA_REMOVE_BY_EXPIRE, SpellInfo::AuraInterruptFlags, Object::ForceValuesUpdateAtIndex(), SpellInfo::GetAuraState(), AuraApplication::GetBase(), Aura::GetCaster(), Aura::GetCasterGUID(), AuraApplication::GetEffectMask(), Object::GetGUID(), Aura::GetId(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), Aura::GetSpellInfo(), AuraApplication::GetTarget(), Aura::HandleAuraSpecificMods(), AuraApplication::HasEffect(), IsAIEnabled, IsTotem(), JustDied, LOG_DEBUG, m_appliedAuras, m_auraStateAuras, m_interruptableAuras, m_removedAurasCount, MAX_SPELL_EFFECTS, ModifyAuraState(), CreatureAI::OnAuraRemove(), PER_CASTER_AURA_STATE_MASK, Minion::setDeathState(), AuraApplication::SetRemoveMode(), sScriptMgr, Object::ToCreature(), TOTEM_PASSIVE, ToTotem(), UNIT_FIELD_AURASTATE, and UpdateInterruptMask().

Referenced by Aura::_Remove(), _UnapplyAura(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAura(), and RemoveEvadeAuras().

◆ _UnregisterDynObject()

void Unit::_UnregisterDynObject ( DynamicObject dynObj)
6211{
6212 m_dynObj.remove(dynObj);
6213}

References m_dynObj.

Referenced by DynamicObject::UnbindFromCaster().

◆ _UpdateAutoRepeatSpell()

void Unit::_UpdateAutoRepeatSpell ( )
protected
3931{
3932 SpellInfo const* spellProto = nullptr;
3934 {
3936 }
3937
3938 if (!spellProto)
3939 {
3940 return;
3941 }
3942
3943 static uint32 const HUNTER_AUTOSHOOT = 75;
3944
3945 // Check "realtime" interrupts
3946 if ((IsPlayer() && ToPlayer()->isMoving() && spellProto->Id != HUNTER_AUTOSHOOT) || IsNonMeleeSpellCast(false, false, true, spellProto->Id == HUNTER_AUTOSHOOT))
3947 {
3948 // cancel wand shoot
3949 if (spellProto->Id != HUNTER_AUTOSHOOT)
3951 m_AutoRepeatFirstCast = true;
3952 return;
3953 }
3954
3955 // Apply delay (Hunter's autoshoot not affected)
3956 if (m_AutoRepeatFirstCast && getAttackTimer(RANGED_ATTACK) < 500 && spellProto->Id != HUNTER_AUTOSHOOT)
3957 {
3959 }
3960
3961 m_AutoRepeatFirstCast = false;
3962
3963 // Check for ranged attack timer
3965 {
3967 if (result != SPELL_CAST_OK)
3968 {
3969 if (spellProto->Id != HUNTER_AUTOSHOOT)
3970 {
3972 }
3973
3974 return;
3975 }
3976
3977 // We want to shoot
3978 Spell* spell = new Spell(this, spellProto, TRIGGERED_FULL_MASK);
3979 spell->prepare(&(m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_targets));
3980
3981 // Reset attack
3983 }
3984}
SpellCastResult
Definition SharedDefines.h:948
@ SPELL_CAST_OK
Definition SharedDefines.h:1138
@ TRIGGERED_FULL_MASK
Will return SPELL_FAILED_DONT_REPORT in CheckCast functions.
Definition SpellDefines.h:150
@ CURRENT_AUTOREPEAT_SPELL
Definition Unit.h:541
Definition Spell.h:287
SpellCastResult prepare(SpellCastTargets const *targets, AuraEffect const *triggeredByAura=nullptr)
Definition Spell.cpp:3488
SpellCastResult CheckCast(bool strict)
Definition Spell.cpp:5677
SpellInfo const *const m_spellInfo
Definition Spell.h:523
void InterruptSpell(CurrentSpellTypes spellType, bool withDelayed=true, bool withInstant=true, bool bySelf=false)
Definition Unit.cpp:4107
bool IsNonMeleeSpellCast(bool withDelayed, bool skipChanneled=false, bool skipAutorepeat=false, bool isAutoshoot=false, bool skipInstant=true) const
Definition Unit.cpp:4146
void setAttackTimer(WeaponAttackType type, int32 time)
Definition Unit.h:830
bool isMoving() const
Definition Unit.h:1622
int32 getAttackTimer(WeaponAttackType type) const
Definition Unit.h:832
bool isAttackReady(WeaponAttackType type=BASE_ATTACK) const
Definition Unit.h:833
void resetAttackTimer(WeaponAttackType type=BASE_ATTACK)
Definition Unit.cpp:643

References Spell::CheckCast(), CURRENT_AUTOREPEAT_SPELL, getAttackTimer(), SpellInfo::Id, InterruptSpell(), isAttackReady(), isMoving(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_spellInfo, Spell::prepare(), RANGED_ATTACK, resetAttackTimer(), setAttackTimer(), SPELL_CAST_OK, Object::ToPlayer(), and TRIGGERED_FULL_MASK.

Referenced by _UpdateSpells().

◆ _UpdateSpells()

void Unit::_UpdateSpells ( uint32  time)
protected
3873{
3876
3877 // remove finished spells from current pointers
3878 for (uint32 i = 0; i < CURRENT_MAX_SPELL; ++i)
3879 {
3880 if (m_currentSpells[i] && m_currentSpells[i]->getState() == SPELL_STATE_FINISHED)
3881 {
3883 m_currentSpells[i] = nullptr; // remove pointer
3884 }
3885 }
3886
3887 // m_auraUpdateIterator can be updated in indirect called code at aura remove to skip next planned to update but removed auras
3889 {
3890 Aura* i_aura = m_auraUpdateIterator->second;
3891 ++m_auraUpdateIterator; // need shift to next for allow update if need into aura update
3892 i_aura->UpdateOwner(time, this);
3893 }
3894
3895 // remove expired auras - do that after updates(used in scripts?)
3896 for (AuraMap::iterator i = m_ownedAuras.begin(); i != m_ownedAuras.end();)
3897 {
3898 if (i->second->IsExpired())
3900 else if (i->second->GetSpellInfo()->IsChanneled() && i->second->GetCasterGUID() != GetGUID() && !ObjectAccessor::GetWorldObject(*this, i->second->GetCasterGUID()))
3901 RemoveOwnedAura(i, AURA_REMOVE_BY_CANCEL); // remove channeled auras when caster is not on the same map
3902 else
3903 ++i;
3904 }
3905
3906 for (VisibleAuraMap::iterator itr = m_visibleAuras.begin(); itr != m_visibleAuras.end(); ++itr)
3907 if (itr->second->IsNeedClientUpdate())
3908 itr->second->ClientUpdate();
3909
3911
3912 if (!m_gameObj.empty())
3913 {
3914 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
3915 {
3916 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
3917 if (!go->isSpawned())
3918 {
3919 go->SetOwnerGUID(ObjectGuid::Empty);
3920 go->SetRespawnTime(0);
3921 go->Delete();
3922 m_gameObj.erase(itr++);
3923 continue;
3924 }
3925 ++itr;
3926 }
3927 }
3928}
@ AURA_REMOVE_BY_CANCEL
Definition SpellAuraDefines.h:393
@ SPELL_STATE_FINISHED
Definition Spell.h:229
void UpdateOwner(uint32 diff, WorldObject *owner)
Definition SpellAuras.cpp:756
Definition GameObject.h:120
void RemoveOwnedAura(AuraMap::iterator &i, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4761
void _UpdateAutoRepeatSpell()
Definition Unit.cpp:3930
VisibleAuraMap m_visibleAuras
Definition Unit.h:2095
GameObject * GetGameObject(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:184
WorldObject * GetWorldObject(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:115

References _DeleteRemovedAuras(), _UpdateAutoRepeatSpell(), AURA_REMOVE_BY_CANCEL, AURA_REMOVE_BY_EXPIRE, CURRENT_AUTOREPEAT_SPELL, CURRENT_MAX_SPELL, ObjectGuid::Empty, ObjectAccessor::GetGameObject(), Object::GetGUID(), ObjectAccessor::GetWorldObject(), m_auraUpdateIterator, m_currentSpells, m_gameObj, m_ownedAuras, m_visibleAuras, RemoveOwnedAura(), Spell::SetReferencedFromCurrent(), SPELL_STATE_FINISHED, and Aura::UpdateOwner().

Referenced by Update().

◆ AddAura() [1/2]

Aura * Unit::AddAura ( SpellInfo const *  spellInfo,
uint8  effMask,
Unit target 
)
18965{
18966 if (!spellInfo)
18967 return nullptr;
18968
18969 if (target->IsImmunedToSpell(spellInfo))
18970 return nullptr;
18971
18972 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; ++i)
18973 {
18974 if (!(effMask & (1 << i)))
18975 continue;
18976 if (target->IsImmunedToSpellEffect(spellInfo, i))
18977 effMask &= ~(1 << i);
18978 }
18979
18980 if (Aura* aura = Aura::TryRefreshStackOrCreate(spellInfo, effMask, target, this))
18981 {
18982 aura->ApplyForTargets();
18983 return aura;
18984 }
18985 return nullptr;
18986}
static Aura * TryRefreshStackOrCreate(SpellInfo const *spellproto, uint8 tryEffMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, bool *refresh=nullptr, bool periodicReset=false)
Definition SpellAuras.cpp:326
virtual bool IsImmunedToSpellEffect(SpellInfo const *spellInfo, uint32 index) const
Definition Unit.cpp:13089
virtual bool IsImmunedToSpell(SpellInfo const *spellInfo, Spell const *spell=nullptr)
Definition Unit.cpp:12999

References Aura::ApplyForTargets(), IsImmunedToSpell(), IsImmunedToSpellEffect(), MAX_SPELL_EFFECTS, and Aura::TryRefreshStackOrCreate().

◆ AddAura() [2/2]

Aura * Unit::AddAura ( uint32  spellId,
Unit target 
)
18950{
18951 if (!target)
18952 return nullptr;
18953
18954 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
18955 if (!spellInfo)
18956 return nullptr;
18957
18958 if (!target->IsAlive() && !spellInfo->HasAttribute(SPELL_ATTR0_PASSIVE) && !spellInfo->HasAttribute(SPELL_ATTR2_ALLOW_DEAD_TARGET))
18959 return nullptr;
18960
18961 return AddAura(spellInfo, MAX_EFFECT_MASK, target);
18962}
#define MAX_EFFECT_MASK
Definition DBCStructure.h:1639
@ SPELL_ATTR2_ALLOW_DEAD_TARGET
Definition SharedDefines.h:456
@ SPELL_ATTR0_PASSIVE
Definition SharedDefines.h:388
bool HasAttribute(SpellAttr0 attribute) const
Definition SpellInfo.h:415
Aura * AddAura(uint32 spellId, Unit *target)
Definition Unit.cpp:18949

References AddAura(), SpellInfo::HasAttribute(), IsAlive(), MAX_EFFECT_MASK, SPELL_ATTR0_PASSIVE, SPELL_ATTR2_ALLOW_DEAD_TARGET, and sSpellMgr.

Referenced by AddAura(), boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_pet_dk_ebon_gargoyle::AttackStart(), boss_anzu::boss_anzu(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoTriggersOnSpellHit(), npc_anubisath_sentinel::aqsentinelAI::GainSentinelAbility(), AuraEffect::HandleAuraDummy(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterAdd(), gm_commandscript::HandleGMVisibleCommand(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_transitus_shield_beam_aura::HandleOnEffectApply(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pallid_horror::InitializeAI(), Guardian::InitStatsForLevel(), boss_gahzranka::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_dalaran_warrior::npc_dalaran_warriorAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Creature::LoadCreaturesAddon(), npc_brew_bubble::MoveInLineOfSight(), npc_pet_gen_plump_turkey::MovementInform(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_empowered_aura::OnPeriodic(), instance_stratholme::instance_stratholme_InstanceMapScript::OnPlayerEnter(), BattlefieldWG::OnPlayerEnterZone(), AreaTrigger_at_area_52_entrance::OnTrigger(), Player::ProcessDelayedOperations(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_corrupted_totem::Reset(), npc_troll_volunteer::npc_troll_volunteerAI::Reset(), npc_vengeful_shade::npc_vengeful_shadeAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_magus_telestra::Reset(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_archavon::boss_archavonAI::Reset(), boss_emalon::boss_emalonAI::Reset(), boss_koralon::boss_koralonAI::Reset(), boss_toravon::boss_toravonAI::Reset(), npc_dalaran_mage::npc_dalaran_mageAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Player::SendInitialPacketsAfterAddToMap(), npc_corrupted_totem::SetAura(), SetAuraStack(), Player::SetGMVisible(), Player::SetIsSpectator(), npc_artorius::npc_artoriusAI::SpellHit(), npc_simone::npc_simoneAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHitTarget(), boss_netherspite::SwitchToPortalPhase(), boss_gyth::boss_gythAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), boss_netherspite::UpdatePortals(), and npc_emily::npc_emilyAI::WaypointReached().

◆ AddComboPointHolder()

void Unit::AddComboPointHolder ( Unit unit)
inline
962{ m_ComboPointHolders.insert(unit); }
std::unordered_set< Unit * > m_ComboPointHolders
Definition Unit.h:2161

References m_ComboPointHolders.

Referenced by AddComboPoints().

◆ AddComboPoints() [1/2]

void Unit::AddComboPoints ( int8  count)
inline
959{ AddComboPoints(nullptr, count); }
void AddComboPoints(Unit *target, int8 count)
Definition Unit.cpp:16910

References AddComboPoints().

Referenced by AddComboPoints().

◆ AddComboPoints() [2/2]

void Unit::AddComboPoints ( Unit target,
int8  count 
)
16911{
16912 if (!count)
16913 {
16914 return;
16915 }
16916
16917 if (target && target != m_comboTarget)
16918 {
16919 if (m_comboTarget)
16920 {
16922 }
16923
16924 m_comboTarget = target;
16925 m_comboPoints = count;
16926 target->AddComboPointHolder(this);
16927 }
16928 else
16929 {
16930 m_comboPoints = std::max<int8>(std::min<int8>(m_comboPoints + count, 5), 0);
16931 }
16932
16934}
void SendComboPoints()
Definition Unit.cpp:16953
void AddComboPointHolder(Unit *unit)
Definition Unit.h:962
void RemoveComboPointHolder(Unit *unit)
Definition Unit.h:963

References AddComboPointHolder(), m_comboPoints, m_comboTarget, RemoveComboPointHolder(), and SendComboPoints().

Referenced by Spell::_handle_finish_phase(), AuraEffect::HandleAuraRetainComboPoints(), and ProcDamageAndSpellFor().

◆ AddExtraAttacks()

void Unit::AddExtraAttacks ( uint32  count)
2796{
2798 if (!targetGUID)
2799 {
2800 if (ObjectGuid selection = GetTarget())
2801 {
2802 targetGUID = selection; // Spell was cast directly (not triggered by aura)
2803 }
2804 else
2805 return;
2806 }
2807
2808 extraAttacksTargets[targetGUID] += count;
2809}
std::unordered_map< ObjectGuid, uint32 > extraAttacksTargets
Definition Unit.h:2172
ObjectGuid _lastDamagedTargetGuid
Definition Unit.h:2173
ObjectGuid GetTarget() const
Definition Unit.h:811

References _lastDamagedTargetGuid, extraAttacksTargets, and GetTarget().

Referenced by Spell::EffectAddExtraAttacks().

◆ AddExtraUnitMovementFlag()

void Unit::AddExtraUnitMovementFlag ( uint16  f)
inline
733{ m_movementInfo.flags2 |= f; }
MovementInfo m_movementInfo
Definition Object.h:658
uint16 flags2
Definition Object.h:292

References MovementInfo::flags2, and WorldObject::m_movementInfo.

Referenced by Vehicle::InitMovementInfoForBase().

◆ addFollower()

void Unit::addFollower ( FollowerReference pRef)
inline
void insertFirst(LinkedListElement *pElem)
Definition LinkedList.h:105
FollowerRefMgr m_FollowingRefMgr
Definition Unit.h:2157

References LinkedListHead::insertFirst(), and m_FollowingRefMgr.

Referenced by FollowerReference::targetObjectBuildLink().

◆ AddGameObject()

void Unit::AddGameObject ( GameObject gameObj)
6267{
6268 if (!gameObj || gameObj->GetOwnerGUID())
6269 return;
6270
6271 m_gameObj.push_back(gameObj->GetGUID());
6272 gameObj->SetOwnerGUID(GetGUID());
6273
6274 if (IsPlayer() && gameObj->GetSpellId())
6275 {
6276 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(gameObj->GetSpellId());
6277 // Need disable spell use for owner
6278 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6279 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6280 ToPlayer()->AddSpellAndCategoryCooldowns(createBySpell, 0, nullptr, true);
6281 }
6282}
uint32 GetSpellId() const
Definition GameObject.h:181
void SetOwnerGUID(ObjectGuid owner)
Definition GameObject.h:163
ObjectGuid GetOwnerGUID() const
Definition GameObject.h:173
void AddSpellAndCategoryCooldowns(SpellInfo const *spellInfo, uint32 itemId, Spell *spell=nullptr, bool infinityCooldown=false)
Definition Player.cpp:10887
bool IsCooldownStartedOnEvent() const
Definition SpellInfo.cpp:1212

References Player::AddSpellAndCategoryCooldowns(), Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, GameObject::SetOwnerGUID(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::EffectDuel(), Spell::EffectSummonObject(), Spell::EffectTransmitted(), npc_midsummer_bonfire::Ignite(), and WorldObject::SummonGameObject().

◆ addHatedBy()

void Unit::addHatedBy ( HostileReference pHostileReference)
inline

◆ AddInterruptMask()

void Unit::AddInterruptMask ( uint32  mask)
inline
1523{ m_interruptMask |= mask; }

References m_interruptMask.

Referenced by _CreateAuraApplication(), and Spell::handle_immediate().

◆ AddPetAura()

void Unit::AddPetAura ( PetAura const *  petSpell)
17370{
17371 if (!IsPlayer())
17372 return;
17373
17374 m_petAuras.insert(petSpell);
17375 if (Pet* pet = ToPlayer()->GetPet())
17376 pet->CastPetAura(petSpell);
17377 else if (Unit* charm = GetCharm())
17378 charm->CastPetAura(petSpell);
17379}
Definition Pet.h:41
Unit * GetCharm() const
Definition Unit.cpp:10757
PetAuraSet m_petAuras
Definition Unit.h:2010
Pet * GetPet(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:215

References GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Spell::EffectDummy(), and AuraEffect::HandleAuraDummy().

◆ AddPlayerToVision()

void Unit::AddPlayerToVision ( Player player)
11256{
11257 if (m_sharedVision.empty())
11258 setActive(true);
11259
11260 m_sharedVision.push_back(player);
11261 player->m_isInSharedVisionOf.insert(this);
11262}
void setActive(bool isActiveObject)
Definition Object.cpp:1075

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

◆ AddPointedBy()

void Unit::AddPointedBy ( SafeUnitPointer sup)
inline
1934{ SafeUnitPointerSet.insert(sup); }
std::set< SafeUnitPointer * > SafeUnitPointerSet
Definition Unit.h:2019

References SafeUnitPointerSet.

Referenced by SafeUnitPointer::SetPointedTo().

◆ AddSpellCooldown()

virtual void Unit::AddSpellCooldown ( uint32  ,
uint32  ,
uint32  ,
bool  needSendToClient = false,
bool  forceSendToSpectator = false 
)
inlinevirtual

◆ AddThreat()

void Unit::AddThreat ( Unit victim,
float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  threatSpell = nullptr 
)
14744{
14745 // Only mobs can manage threat lists
14747 {
14748 m_ThreatMgr.AddThreat(victim, fThreat, schoolMask, threatSpell);
14749 }
14750}
@ UNIT_STATE_EVADE
Definition UnitDefines.h:191
void AddThreat(Unit *victim, float threat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition ThreatMgr.cpp:436
bool HasUnitState(const uint32 f) const
Definition Unit.h:691
bool CanHaveThreatList(bool skipAliveCheck=false) const
Definition Unit.cpp:14704

References ThreatMgr::AddThreat(), CanHaveThreatList(), HasUnitState(), m_ThreatMgr, and UNIT_STATE_EVADE.

Referenced by Attack(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::AttackStart(), npc_capernian::AttackStart(), npc_zuljin_vortex::ChangeToNewPlayer(), npc_dirt_mound::ChaseNewTarget(), boss_buru::ChaseNewVictim(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DamageTaken(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), DealDamage(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), CreatureAI::DoZoneInCombat(), Spell::EffectThreat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), npc_raging_flames::FixateRandomTarget(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), spell_morogrim_tidewalker_water_globule_new_target::HandleDummy(), HandleDummyAuraProc(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), AuraEffect::HandlePeriodicManaLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_the_lich_king_vile_spirit_move_target_search::HandleScript(), spell_pursue::HandleScript(), Spell::HandleThreatSpells(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_tiger_matriarch::npc_tiger_matriarchAI::IsSummonedBy(), npc_little_ooze::npc_little_oozeAI::IsSummonedBy(), npc_malchezaar_axe::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_buru::JustEngagedWith(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), boss_curator::JustSummoned(), boss_sacrolash::JustSummoned(), boss_devourer_of_souls::boss_devourer_of_soulsAI::JustSummoned(), npc_akama_illidan::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), boss_shade_of_akama::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_mage_mirror_image::MySelectNextTarget(), SmartScript::ProcessAction(), RemoveCharmedBy(), npc_dark_fiend::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), boss_skarvald_the_constructor::Reset(), boss_dalronn_the_controller::Reset(), npc_pet_hunter_snake_trap::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_romulo::ScheduleCombat(), npc_thaladred::ScheduleEvents(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), boss_supremus::SchedulePhase(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), brann_bronzebeard::brann_bronzebeardAI::SummonCreatures(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), and npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI().

◆ AddToWorld()

void Unit::AddToWorld ( )
overridevirtual

Reimplemented from Object.

15765{
15766 if (!IsInWorld())
15767 {
15769 }
15770}
void AddToWorld() override
Definition Object.cpp:1168

References WorldObject::AddToWorld(), and Object::IsInWorld().

Referenced by Creature::AddToWorld(), Pet::AddToWorld(), and Player::AddToWorld().

◆ AddUnitMovementFlag()

◆ AddUnitState()

void Unit::AddUnitState ( uint32  f)
inline
690{ m_state |= f; }

References m_state.

Referenced by _ExitVehicle(), RandomMovementGenerator< T >::_setRandomLocation(), MotionTransport::AddPassenger(), Attack(), boss_prince_keleseth_icc::boss_prince_kelesethAI::boss_prince_kelesethAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::boss_prince_taldaramAI(), boss_prince_valanar_icc::boss_prince_valanarAI::boss_prince_valanarAI(), Creature::Create(), MotionTransport::CreateNPCPassenger(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), boss_nightbane::DoAction(), WaypointMovementGenerator< Creature >::DoInitialize(), RandomMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoReset(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_jindo::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), Creature::FocusTarget(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetCastSpellOpcode(), RotateMovementGenerator::Initialize(), DistractMovementGenerator::Initialize(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Player::LoadFromDB(), boss_ayamiss::MovementInform(), boss_lady_vashj::MovementInform(), npc_pet_gen_moth::npc_pet_gen_moth(), npc_pet_gen_valkyr_guardian::npc_pet_gen_valkyr_guardian(), npc_pet_gen_wind_rider_cub::npc_pet_gen_wind_rider_cub(), npc_corrupted_totem::Reset(), boss_jedoga_shadowseeker::Reset(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), boss_hungarfen::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), SetCharmedBy(), SetContestedPvP(), SetControlled(), SetCurrentCastedSpell(), Player::setDeathState(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), WaypointMovementGenerator< Creature >::StartMove(), npc_madrigosa::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), and boss_svala::boss_svalaAI::UpdateAI().

◆ AddUnitTypeMask()

void Unit::AddUnitTypeMask ( uint32  mask)
inline
697{ m_unitTypeMask |= mask; }

References m_unitTypeMask.

◆ ApplyAttackTimePercentMod()

void Unit::ApplyAttackTimePercentMod ( WeaponAttackType  att,
float  val,
bool  apply 
)
17127{
17128 float remainingTimePct = std::max((float)m_attackTimer[att], 0.0f) / (GetAttackTime(att) * m_modAttackSpeedPct[att]);
17129 if (val > 0)
17130 {
17132 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, val, !apply);
17133 }
17134 else
17135 {
17137 ApplyPercentModFloatValue(static_cast<uint16>(UNIT_FIELD_BASEATTACKTIME) + att, -val, apply);
17138 }
17139 m_attackTimer[att] = uint32(GetAttackTime(att) * m_modAttackSpeedPct[att] * remainingTimePct);
17140}
std::uint16_t uint16
Definition Define.h:108
@ UNIT_FIELD_BASEATTACKTIME
Definition UpdateFields.h:120
void ApplyPercentModFloatVar(float &var, float val, bool apply)
Definition Util.h:50
void ApplyPercentModFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:829
uint32 GetAttackTime(WeaponAttackType att) const
Definition Unit.h:859

References Object::ApplyPercentModFloatValue(), ApplyPercentModFloatVar(), GetAttackTime(), m_attackTimer, m_modAttackSpeedPct, and UNIT_FIELD_BASEATTACKTIME.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleAuraModRangedHaste(), AuraEffect::HandleModAttackSpeed(), AuraEffect::HandleModCombatSpeedPct(), AuraEffect::HandleModMeleeRangedSpeedPct(), AuraEffect::HandleModMeleeSpeedPct(), and AuraEffect::HandleRangedAmmoHaste().

◆ ApplyCastTimePercentMod()

void Unit::ApplyCastTimePercentMod ( float  val,
bool  apply 
)
17143{
17144 if (val > 0)
17146 else
17148}
@ UNIT_MOD_CAST_SPEED
Definition UpdateFields.h:137

References Object::ApplyPercentModFloatValue(), and UNIT_MOD_CAST_SPEED.

Referenced by Player::ApplyRatingMod(), AuraEffect::HandleModCastingSpeed(), and AuraEffect::HandleModCombatSpeedPct().

◆ ApplyDiminishingAura()

void Unit::ApplyDiminishingAura ( DiminishingGroup  group,
bool  apply 
)
15217{
15218 // Checking for existing in the table
15219 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15220 {
15221 if (i->DRGroup != group)
15222 continue;
15223
15224 if (apply)
15225 i->stack += 1;
15226 else if (i->stack)
15227 {
15228 i->stack -= 1;
15229 // Remember time after last aura from group removed
15230 if (i->stack == 0)
15231 i->hitTime = GameTime::GetGameTimeMS().count();
15232 }
15233 break;
15234 }
15235}
Diminishing m_Diminishing
Definition Unit.h:2153
Milliseconds GetGameTimeMS()
Definition GameTime.cpp:43

References GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by UnitAura::_ApplyForTarget(), and UnitAura::_UnapplyForTarget().

◆ ApplyDiminishingToDuration()

float Unit::ApplyDiminishingToDuration ( DiminishingGroup  group,
int32 duration,
Unit caster,
DiminishingLevels  Level,
int32  limitduration 
)
15138{
15139 // xinef: dont apply diminish to self casts
15140 if (duration == -1 || group == DIMINISHING_NONE)
15141 return 1.0f;
15142
15143 // test pet/charm masters instead pets/charmeds
15144 Unit const* targetOwner = GetOwner();
15145 Unit const* casterOwner = caster->GetOwner();
15146
15147 // Duration of crowd control abilities on pvp target is limited by 10 sec. (2.2.0)
15148 if (limitduration > 0 && duration > limitduration)
15149 {
15150 Unit const* target = targetOwner ? targetOwner : this;
15151 Unit const* source = casterOwner ? casterOwner : caster;
15152
15153 if ((target->IsPlayer()
15155 && source->IsPlayer())
15156 duration = limitduration;
15157 }
15158
15159 float mod = 1.0f;
15160
15161 if (group == DIMINISHING_TAUNT)
15162 {
15164 {
15165 DiminishingLevels diminish = Level;
15166 switch (diminish)
15167 {
15169 break;
15171 mod = 0.65f;
15172 break;
15174 mod = 0.4225f;
15175 break;
15177 mod = 0.274625f;
15178 break;
15180 mod = 0.0f;
15181 break;
15182 default:
15183 break;
15184 }
15185 }
15186 }
15187 // Some diminishings applies to mobs too (for example, Stun)
15189 && ((targetOwner ? (targetOwner->IsPlayer()) : (IsPlayer()))
15190 || (IsCreature() && ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_ALL_DIMINISH))))
15192 {
15193 DiminishingLevels diminish = Level;
15194 switch (diminish)
15195 {
15197 break;
15199 mod = 0.5f;
15200 break;
15202 mod = 0.25f;
15203 break;
15205 mod = 0.0f;
15206 break;
15207 default:
15208 break;
15209 }
15210 }
15211
15212 duration = int32(duration * mod);
15213 return mod;
15214}
@ CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS
Definition CreatureData.h:64
@ CREATURE_FLAG_EXTRA_ALL_DIMINISH
Definition CreatureData.h:65
@ Level
Requires the player to be at least a specific level.
@ DIMINISHING_NONE
Definition SharedDefines.h:3497
@ DIMINISHING_TAUNT
Definition SharedDefines.h:3515
@ DRTYPE_PLAYER
Definition SharedDefines.h:3490
@ DRTYPE_ALL
Definition SharedDefines.h:3491
DiminishingReturnsType GetDiminishingReturnsGroupType(DiminishingGroup group)
Definition SpellMgr.cpp:245
DiminishingLevels
Definition Unit.h:263
@ DIMINISHING_LEVEL_3
Definition Unit.h:266
@ DIMINISHING_LEVEL_1
Definition Unit.h:264
@ DIMINISHING_LEVEL_4
Definition Unit.h:268
@ DIMINISHING_LEVEL_IMMUNE
Definition Unit.h:267
@ DIMINISHING_LEVEL_TAUNT_IMMUNE
Definition Unit.h:269
@ DIMINISHING_LEVEL_2
Definition Unit.h:265
bool HasFlagsExtra(uint32 flag) const
Definition Creature.h:73

References CREATURE_FLAG_EXTRA_ALL_DIMINISH, CREATURE_FLAG_EXTRA_OBEYS_TAUNT_DIMINISHING_RETURNS, DIMINISHING_LEVEL_1, DIMINISHING_LEVEL_2, DIMINISHING_LEVEL_3, DIMINISHING_LEVEL_4, DIMINISHING_LEVEL_IMMUNE, DIMINISHING_LEVEL_TAUNT_IMMUNE, DIMINISHING_NONE, DIMINISHING_TAUNT, DRTYPE_ALL, DRTYPE_PLAYER, GetDiminishingReturnsGroupType(), GetOwner(), Creature::HasFlagsExtra(), Object::IsCreature(), Object::IsPlayer(), Level, and Object::ToCreature().

Referenced by Spell::DoSpellHitOnUnit().

◆ ApplyEffectModifiers()

float Unit::ApplyEffectModifiers ( SpellInfo const *  spellProto,
uint8  effect_index,
float  value 
) const
14920{
14921 if (Player* modOwner = GetSpellModOwner())
14922 {
14923 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_ALL_EFFECTS, value);
14924 switch (effect_index)
14925 {
14926 case 0:
14927 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT1, value);
14928 break;
14929 case 1:
14930 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT2, value);
14931 break;
14932 case 2:
14933 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_EFFECT3, value);
14934 break;
14935 }
14936 }
14937 return value;
14938}
@ SPELLMOD_EFFECT2
Definition SpellDefines.h:88
@ SPELLMOD_ALL_EFFECTS
Definition SpellDefines.h:84
@ SPELLMOD_EFFECT3
Definition SpellDefines.h:99
@ SPELLMOD_EFFECT1
Definition SpellDefines.h:79
Player * GetSpellModOwner() const
Definition Unit.cpp:16649

References GetSpellModOwner(), SpellInfo::Id, SPELLMOD_ALL_EFFECTS, SPELLMOD_EFFECT1, SPELLMOD_EFFECT2, and SPELLMOD_EFFECT3.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellEffectInfo::CalcValue(), and Spell::EffectSchoolDMG().

◆ ApplyResilience()

void Unit::ApplyResilience ( Unit const *  victim,
float *  crit,
int32 damage,
bool  isCrit,
CombatRating  type 
)
static
19014{
19015 // player mounted on multi-passenger mount is also classified as vehicle
19016 if (victim->IsVehicle() && !victim->IsPlayer())
19017 return;
19018
19019 Unit const* target = nullptr;
19020 if (victim->IsPlayer())
19021 target = victim;
19022 else if (victim->IsCreature())
19023 {
19024 if (Unit* owner = victim->GetOwner())
19025 if (owner->IsPlayer())
19026 target = owner;
19027 }
19028
19029 if (!target)
19030 return;
19031
19032 switch (type)
19033 {
19035 // Crit chance reduction works against nonpets
19036 if (crit)
19037 *crit -= target->GetMeleeCritChanceReduction();
19038 if (damage)
19039 {
19040 if (isCrit)
19041 *damage -= target->GetMeleeCritDamageReduction(*damage);
19042 *damage -= target->GetMeleeDamageReduction(*damage);
19043 }
19044 break;
19046 // Crit chance reduction works against nonpets
19047 if (crit)
19048 *crit -= target->GetRangedCritChanceReduction();
19049 if (damage)
19050 {
19051 if (isCrit)
19052 *damage -= target->GetRangedCritDamageReduction(*damage);
19053 *damage -= target->GetRangedDamageReduction(*damage);
19054 }
19055 break;
19057 // Crit chance reduction works against nonpets
19058 if (crit)
19059 *crit -= target->GetSpellCritChanceReduction();
19060 if (damage)
19061 {
19062 if (isCrit)
19063 *damage -= target->GetSpellCritDamageReduction(*damage);
19064 *damage -= target->GetSpellDamageReduction(*damage);
19065 }
19066 break;
19067 default:
19068 break;
19069 }
19070}
@ CR_CRIT_TAKEN_RANGED
Definition Unit.h:233
@ CR_CRIT_TAKEN_SPELL
Definition Unit.h:234
@ CR_CRIT_TAKEN_MELEE
Definition Unit.h:232
float GetSpellCritChanceReduction() const
Definition Unit.h:1199
float GetRangedCritChanceReduction() const
Definition Unit.h:1198
uint32 GetSpellCritDamageReduction(uint32 damage) const
Definition Unit.h:1203
float GetMeleeCritChanceReduction() const
Definition Unit.h:1197
uint32 GetRangedDamageReduction(uint32 damage) const
Definition Unit.h:1191
uint32 GetRangedCritDamageReduction(uint32 damage) const
Definition Unit.h:1202
uint32 GetMeleeCritDamageReduction(uint32 damage) const
Definition Unit.h:1201
uint32 GetSpellDamageReduction(uint32 damage) const
Definition Unit.h:1192
uint32 GetMeleeDamageReduction(uint32 damage) const
Definition Unit.h:1190

References CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, GetMeleeCritChanceReduction(), GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetOwner(), GetRangedCritChanceReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritChanceReduction(), GetSpellCritDamageReduction(), GetSpellDamageReduction(), Object::IsCreature(), Object::IsPlayer(), and IsVehicle().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetUnitCriticalChance(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and SpellTakenCritChance().

◆ ApplyResistanceBuffModsMod()

void Unit::ApplyResistanceBuffModsMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline
1128{ ApplyModSignedFloatValue(positive ? static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE) + school : static_cast<uint16>(UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE) + + school, val, apply); }
@ UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE
Definition UpdateFields.h:157
@ UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE
Definition UpdateFields.h:158
void ApplyModSignedFloatValue(uint16 index, float val, bool apply)
Definition Object.cpp:822
void apply(T *val)
Definition ByteConverter.h:40

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, and UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE.

Referenced by AuraEffect::HandleAuraModResistance(), and AuraEffect::HandleAuraModResistanceExclusive().

◆ ApplyResistanceBuffModsPercentMod()

void Unit::ApplyResistanceBuffModsPercentMod ( SpellSchools  school,
bool  positive,
float  val,
bool  apply 
)
inline

◆ ApplySpellDispelImmunity()

void Unit::ApplySpellDispelImmunity ( SpellInfo const *  spellProto,
DispelType  type,
bool  apply 
)
13500{
13501 ApplySpellImmune(spellProto->Id, IMMUNITY_DISPEL, type, apply);
13502
13503 if (apply && spellProto->HasAttribute(SPELL_ATTR1_IMMUNITY_PURGES_EFFECT))
13504 {
13505 // Create dispel mask by dispel type
13506 uint32 dispelMask = SpellInfo::GetDispelMask(type);
13507 // Dispel all existing auras vs current dispel type
13509 for (AuraApplicationMap::iterator itr = auras.begin(); itr != auras.end();)
13510 {
13511 SpellInfo const* spell = itr->second->GetBase()->GetSpellInfo();
13512 if (spell->GetDispelMask() & dispelMask)
13513 {
13514 // Dispel aura
13515 RemoveAura(itr);
13516 }
13517 else
13518 ++itr;
13519 }
13520 }
13521}
@ SPELL_ATTR1_IMMUNITY_PURGES_EFFECT
Definition SharedDefines.h:434
@ IMMUNITY_DISPEL
Definition SharedDefines.h:1398
uint32 GetDispelMask() const
Definition SpellInfo.cpp:2052
void ApplySpellImmune(uint32 spellId, uint32 op, uint32 type, bool apply, SpellImmuneBlockType blockType=SPELL_BLOCK_TYPE_ALL)
Definition Unit.cpp:13472
std::multimap< uint32, AuraApplication * > AuraApplicationMap
Definition Unit.h:629
AuraApplicationMap & GetAppliedAuras()
Definition Unit.h:1306

References ApplySpellImmune(), GetAppliedAuras(), SpellInfo::GetDispelMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IMMUNITY_DISPEL, RemoveAura(), and SPELL_ATTR1_IMMUNITY_PURGES_EFFECT.

Referenced by AuraEffect::HandleAuraModDispelImmunity().

◆ ApplySpellImmune()

void Unit::ApplySpellImmune ( uint32  spellId,
uint32  op,
uint32  type,
bool  apply,
SpellImmuneBlockType  blockType = SPELL_BLOCK_TYPE_ALL 
)
13473{
13474 if (apply)
13475 {
13476 // xinef: immunities with spellId 0 are intended to be applied only once (script purposes mosty)
13477 if (spellId == 0 && std::find_if(m_spellImmune[op].begin(), m_spellImmune[op].end(), spellIdImmunityPredicate(type)) != m_spellImmune[op].end())
13478 return;
13479
13480 SpellImmune immune;
13481 immune.spellId = spellId;
13482 immune.type = type;
13483 immune.blockType = blockType;
13484 m_spellImmune[op].push_back(std::move(immune));
13485 }
13486 else
13487 {
13488 for (SpellImmuneList::iterator itr = m_spellImmune[op].begin(); itr != m_spellImmune[op].end(); ++itr)
13489 {
13490 if (itr->spellId == spellId && itr->type == type)
13491 {
13492 m_spellImmune[op].erase(itr);
13493 break;
13494 }
13495 }
13496 }
13497}
Definition Unit.cpp:13463
Definition SpellDefines.h:174
uint32 blockType
Definition SpellDefines.h:179
uint32 spellId
Definition SpellDefines.h:177
uint32 type
Definition SpellDefines.h:178

References SpellImmune::blockType, m_spellImmune, SpellImmune::spellId, and SpellImmune::type.

Referenced by Vehicle::ApplyAllImmunities(), boss_kelidan_the_breaker::ApplyImmunities(), ApplyMechanicImmune(), ApplySpellDispelImmunity(), boss_anubarak_trial::boss_anubarak_trialAI::boss_anubarak_trialAI(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_icehowl::boss_icehowlAI::boss_icehowlAI(), boss_sindragosa::boss_sindragosaAI::boss_sindragosaAI(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_void_reaver::boss_void_reaver(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDmgImmunity(), AuraEffect::HandleAuraModEffectImmunity(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleAuraModStateImmunity(), Aura::HandleAuraSpecificMods(), spell_q13007_iron_colossus::HandleDummy(), spell_love_in_air_perfume_immune::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_dk_anti_magic_shell_self::HandleEffectApply(), spell_dk_army_of_the_dead_passive::HandleEffectApply(), spell_dk_pet_scaling::HandleEffectApply(), spell_dru_treant_scaling::HandleEffectApply(), spell_pet_hit_expertise_scalling::HandleEffectApply(), spell_pet_intellect_spirit_resilience_scaling::HandleEffectApply(), spell_pet_spellhit_expertise_spellpen_scaling::HandleEffectApply(), spell_mage_pet_scaling::HandleEffectApply(), spell_pri_shadowfiend_scaling::HandleEffectApply(), spell_sha_feral_spirit_scaling::HandleEffectApply(), spell_sha_fire_elemental_scaling::HandleEffectApply(), spell_warl_infernal_scaling::HandleEffectApply(), spell_love_in_air_perfume_immune::HandleEffectRemove(), spell_dk_anti_magic_shell_self::HandleEffectRemove(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_illidan_shadow_prison_aura::HandleOnEffectApply(), spell_illidan_shadow_prison_aura::HandleOnEffectRemove(), npc_hyjal_jaina::hyjalJainaAI::hyjalJainaAI(), boss_hydross_the_unstable::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Player::LoadFromDB(), Creature::LoadSpellTemplateImmunity(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_necrotic_shard::npc_necrotic_shard(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_target_dummy::npc_target_dummyAI::npc_target_dummyAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::npc_tournament_training_dummyAI(), npc_training_dummy::npc_training_dummyAI::npc_training_dummyAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::npc_ulduar_arachnopod_destroyerAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::npc_valkyr_shadowguardAI(), spell_yogg_saron_malady_of_the_mind_aura::OnApply(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnCreatureCreate(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_chesspiece::Reset(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_felblood_kaelthas::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::Reset(), npc_dark_iron_guzzler::Reset(), boss_mal_ganis::boss_mal_ganisAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_gluth::boss_gluthAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_auriaya::boss_auriayaAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_supremus::Reset(), boss_kaelthas::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), boss_supremus::SchedulePhase(), boss_hydross_the_unstable::SetForm(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), and Creature::UpdateEntry().

◆ ApplyStatBuffMod()

void Unit::ApplyStatBuffMod ( Stats  stat,
float  val,
bool  apply 
)
inline
1022{ ApplyModSignedFloatValue((val > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), val, apply); }
@ UNIT_FIELD_POSSTAT0
Definition UpdateFields.h:146
@ UNIT_FIELD_NEGSTAT0
Definition UpdateFields.h:151

References Object::ApplyModSignedFloatValue(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::_ApplyItemBonuses(), Player::ApplyEnchantment(), and AuraEffect::HandleAuraModStat().

◆ ApplyStatPercentBuffMod()

void Unit::ApplyStatPercentBuffMod ( Stats  stat,
float  val,
bool  apply 
)
15428{
15429 if (val == -100.0f) // prevent set var to zero
15430 val = -99.99f;
15431 float var = GetStat(stat) * val / 100.0f;
15432 ApplyModSignedFloatValue((var > 0 ? static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat : static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat), var, apply);
15433}
float GetStat(Stats stat) const
Definition Unit.h:997

References Object::ApplyModSignedFloatValue(), GetStat(), UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by AuraEffect::HandleModTotalPercentStat().

◆ ApplyTotalThreatModifier()

float Unit::ApplyTotalThreatModifier ( float  fThreat,
SpellSchoolMask  schoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
14732{
14733 if (!HasThreatAura() || fThreat < 0)
14734 return fThreat;
14735
14736 SpellSchools school = GetFirstSchoolInMask(schoolMask);
14737
14738 return fThreat * m_threatModifier[school];
14739}
SpellSchools
Definition SharedDefines.h:282
SpellSchools GetFirstSchoolInMask(SpellSchoolMask mask)
Definition SharedDefines.h:318
bool HasThreatAura() const
Definition Unit.h:1745

References GetFirstSchoolInMask(), HasThreatAura(), and m_threatModifier.

Referenced by ThreatCalcHelper::calcThreat().

◆ Attack()

bool Unit::Attack ( Unit victim,
bool  meleeAttack 
)
Todo:
: Implement aggro range, detection range and assistance range templates
10334{
10335 if (!victim || victim == this)
10336 return false;
10337
10338 // dead units can neither attack nor be attacked
10339 if (!IsAlive() || !victim->IsAlive())
10340 return false;
10341
10342 // pussywizard: check map, world, phase >_> multithreading crash fix
10343 if (!IsInMap(victim) || !InSamePhase(victim))
10344 return false;
10345
10346 // player cannot attack in mount state
10347 if (IsPlayer() && IsMounted())
10348 return false;
10349
10350 // creatures cannot attack while evading
10351 Creature* creature = ToCreature();
10352 if (creature && creature->IsInEvadeMode())
10353 {
10354 return false;
10355 }
10356
10357 // creatures should not try to attack the player during polymorph
10358 if (creature && creature->IsPolymorphed())
10359 {
10360 return false;
10361 }
10362
10363 //if (HasUnitFlag(UNIT_FLAG_PACIFIED)) // pussywizard: why having this flag prevents from entering combat? it should just prevent melee attack
10364 // return false;
10365
10366 // nobody can attack GM in GM-mode
10367 if (victim->IsPlayer())
10368 {
10369 if (victim->ToPlayer()->IsGameMaster())
10370 return false;
10371 }
10372 else
10373 {
10374 if (victim->ToCreature()->IsEvadingAttacks())
10375 return false;
10376 }
10377
10378 // Unit with SPELL_AURA_SPIRIT_OF_REDEMPTION can not attack
10380 return false;
10381
10382 // remove SPELL_AURA_MOD_UNATTACKABLE at attack (in case non-interruptible spells stun aura applied also that not let attack)
10383 if (HasUnattackableAura())
10385
10386 if (m_attacking)
10387 {
10388 if (m_attacking == victim)
10389 {
10390 // switch to melee attack from ranged/magic
10391 if (meleeAttack)
10392 {
10394 {
10396 SendMeleeAttackStart(victim);
10397 return true;
10398 }
10399 }
10401 {
10403 SendMeleeAttackStop(victim);
10404 return true;
10405 }
10406 return false;
10407 }
10408
10409 // switch target
10410 InterruptSpell(CURRENT_MELEE_SPELL, true, true, true);
10411 if (!meleeAttack)
10413 }
10414
10415 if (m_attacking)
10417
10418 m_attacking = victim;
10420
10421 // Set our target
10422 SetTarget(victim->GetGUID());
10423
10424 if (meleeAttack)
10426
10427 Unit* owner = GetCharmerOrOwner();
10428 Creature* ownerCreature = owner ? owner->ToCreature() : nullptr;
10429 Creature* controlledCreatureWithSameVictim = nullptr;
10430 if (creature && !m_Controlled.empty())
10431 {
10432 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10433 {
10434 if ((*itr)->ToCreature() && (*itr)->GetVictim() == victim)
10435 {
10436 controlledCreatureWithSameVictim = (*itr)->ToCreature();
10437 break;
10438 }
10439 }
10440 }
10441
10442 // Share leash timer with controlled unit
10443 if (controlledCreatureWithSameVictim)
10444 creature->SetLastLeashExtensionTimePtr(controlledCreatureWithSameVictim->GetLastLeashExtensionTimePtr());
10445 // Share leash timer with owner
10446 else if (creature && ownerCreature && ownerCreature->GetVictim() == victim)
10448 // Update leash timer when attacking creatures
10449 else if (victim->IsCreature())
10451
10452 // set position before any AI calls/assistance
10453 //if (IsCreature())
10454 // ToCreature()->SetCombatStartPosition(GetPositionX(), GetPositionY(), GetPositionZ());
10455 if (creature && !(IsControllableGuardian() && IsControlledByPlayer()))
10456 {
10457 // should not let player enter combat by right clicking target - doesn't helps
10458 SetInCombatWith(victim);
10459 if (victim->IsPlayer())
10460 victim->SetInCombatWith(this);
10461
10462 AddThreat(victim, 0.0f);
10463
10465
10468 creature->CallAssistance();
10469
10471
10473 }
10474
10475 // delay offhand weapon attack by 50% of the base attack time
10478
10479 if (meleeAttack)
10480 SendMeleeAttackStart(victim);
10481
10482 return true;
10483}
@ CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE
Definition CreatureData.h:70
@ EMOTE_ONESHOT_NONE
Definition SharedDefines.h:1894
@ AI_REACTION_HOSTILE
Definition SharedDefines.h:3481
@ SPELL_AURA_MOD_UNATTACKABLE
Definition SpellAuraDefines.h:156
@ UNIT_STATE_MELEE_ATTACKING
Definition UnitDefines.h:171
@ CURRENT_MELEE_SPELL
Definition Unit.h:538
@ UNIT_NPC_EMOTESTATE
Definition UpdateFields.h:140
T CalculatePct(T base, U pct)
Definition Util.h:61
@ CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD
Definition WorldConfig.h:233
void CallAssistance(Unit *target=nullptr)
Definition Creature.cpp:2437
bool IsEvadingAttacks() const
Definition Creature.h:136
std::shared_ptr< time_t > const & GetLastLeashExtensionTimePtr() const
Definition Creature.cpp:3708
void UpdateLeashExtensionTime()
Definition Creature.cpp:3730
void SetAssistanceTimer(uint32 value)
Definition Creature.h:408
void SetLastLeashExtensionTimePtr(std::shared_ptr< time_t > const &timer)
Definition Creature.cpp:3715
void SendAIReaction(AiReaction reactionType)
Definition Creature.cpp:2425
bool IsInEvadeMode() const
Definition Creature.h:135
float GetFloatValue(uint16 index) const
Definition Object.cpp:317
bool IsGameMaster() const
Definition Player.h:1177
bool HasOffhandWeaponForAttack() const
Definition Unit.h:929
void ClearUnitState(uint32 f)
Definition Unit.h:692
bool IsPolymorphed() const
Definition Unit.cpp:16813
void AddThreat(Unit *victim, float fThreat, SpellSchoolMask schoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *threatSpell=nullptr)
Definition Unit.cpp:14743
void _removeAttacker(Unit *pAttacker)
Definition Unit.h:2145
void _addAttacker(Unit *pAttacker)
Definition Unit.h:2144
void SetInCombatWith(Unit *enemy, uint32 duration=0)
Definition Unit.cpp:13664
bool HasUnattackableAura() const
Definition Unit.h:1747
Unit * GetCharmerOrOwner() const
Definition Unit.h:1213
bool IsMounted() const
Definition Unit.h:1800
Unit * GetVictim() const
Definition Unit.h:848
void SendMeleeAttackStart(Unit *victim, Player *sendTo=nullptr)
Definition Unit.cpp:3089
bool IsControllableGuardian() const
Definition Unit.h:746
void SetUInt32Value(uint16 index, uint32 value)
Definition Unit.cpp:21179
void SendMeleeAttackStop(Unit *victim=nullptr)
Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or int...
Definition Unit.cpp:3105
bool IsControlledByPlayer() const
Definition Unit.h:1234
bool HasSpiritOfRedemptionAura() const
Definition Unit.h:1718
virtual void SetTarget(ObjectGuid=ObjectGuid::Empty)=0
bool InSamePhase(WorldObject const *obj) const
Definition Object.h:503
bool IsInMap(WorldObject const *obj) const
Definition Object.cpp:1278
#define sWorld
Definition World.h:320

References _addAttacker(), _removeAttacker(), AddThreat(), AddUnitState(), AI_REACTION_HOSTILE, BASE_ATTACK, CalculatePct(), Creature::CallAssistance(), ClearUnitState(), CONFIG_CREATURE_FAMILY_ASSISTANCE_PERIOD, CREATURE_FLAG_EXTRA_DONT_CALL_ASSISTANCE, CURRENT_MELEE_SPELL, EMOTE_ONESHOT_NONE, getAttackTimer(), GetCharmerOrOwner(), Object::GetFloatValue(), Object::GetGUID(), Creature::GetLastLeashExtensionTimePtr(), GetVictim(), Creature::HasFlagsExtra(), HasOffhandWeaponForAttack(), HasSpiritOfRedemptionAura(), HasUnattackableAura(), HasUnitState(), WorldObject::InSamePhase(), InterruptSpell(), IsAlive(), isAttackReady(), IsControllableGuardian(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), Player::IsGameMaster(), Creature::IsInEvadeMode(), WorldObject::IsInMap(), IsMounted(), Object::IsPlayer(), IsPolymorphed(), m_attacking, m_Controlled, OFF_ATTACK, RemoveAurasByType(), Creature::SendAIReaction(), SendMeleeAttackStart(), SendMeleeAttackStop(), Creature::SetAssistanceTimer(), setAttackTimer(), SetInCombatWith(), Creature::SetLastLeashExtensionTimePtr(), SetTarget(), SetUInt32Value(), SPELL_AURA_MOD_UNATTACKABLE, sWorld, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_BASEATTACKTIME, UNIT_NPC_EMOTESTATE, UNIT_STATE_MELEE_ATTACKING, and Creature::UpdateLeashExtensionTime().

Referenced by UnitAI::AttackStart(), FollowerAI::AttackStart(), PossessedAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::AttackStart(), npc_gunship_mage::npc_gunship_mageAI::AttackStart(), npc_gunship_gunner::npc_gunship_gunnerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), TurretAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), boss_alythess::AttackStart(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), boss_jormungarAI::AttackStart(), boss_four_horsemen::boss_four_horsemenAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_kologarn::boss_kologarnAI::AttackStart(), boss_mimiron::boss_mimironAI::AttackStart(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_the_lurker_below::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), boss_nazan::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), npc_pet_gen_gnomish_flame_turret::AttackStart(), UnitAI::AttackStartCaster(), ScriptedAI::AttackStartNoMove(), PetAI::DoAttack(), WorldSession::HandleAttackSwingOpcode(), spell_q12096_q12092_dummy::HandleDummy(), WorldSession::HandlePetActionHelper(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), boss_halazzi::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), RemoveCharmedBy(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), Player::UpdateCharmedAI(), and npc_ranger_lilatha::WaypointReached().

◆ AttackerStateUpdate()

void Unit::AttackerStateUpdate ( Unit victim,
WeaponAttackType  attType = BASE_ATTACK,
bool  extra = false,
bool  ignoreCasting = false 
)
2592{
2594 {
2595 return;
2596 }
2597
2598 if (HasUnitState(UNIT_STATE_CANNOT_AUTOATTACK) && !extra && !ignoreCasting)
2599 {
2600 return;
2601 }
2602
2603 if (!victim->IsAlive())
2604 return;
2605
2606 if ((attType == BASE_ATTACK || attType == OFF_ATTACK) && !IsWithinLOSInMap(victim))
2607 return;
2608
2609 // CombatStart puts the target into stand state, so we need to cache sit state here to know if we should crit later
2610 const bool sittingVictim = victim->IsPlayer() && (victim->IsSitState() || victim->getStandState() == UNIT_STAND_STATE_SLEEP);
2611
2612 CombatStart(victim);
2614
2615 if (attType != BASE_ATTACK && attType != OFF_ATTACK)
2616 return; // ignore ranged case
2617
2618 if (!extra && _lastExtraAttackSpell)
2619 {
2621 }
2622
2623 bool meleeAttack = true;
2624
2625 // melee attack spell casted at main hand attack only - no normal melee dmg dealt
2626 if (attType == BASE_ATTACK && m_currentSpells[CURRENT_MELEE_SPELL] && !extra)
2627 {
2628 meleeAttack = false; // The melee attack is replaced by the melee spell
2629
2631 SpellCastResult castResult = meleeSpell->CheckCast(false);
2632 if (castResult != SPELL_CAST_OK)
2633 {
2634 meleeSpell->SendCastResult(castResult);
2635 meleeSpell->SendInterrupted(0);
2636
2637 meleeSpell->finish(false);
2638 meleeSpell->SetExecutedCurrently(false);
2639
2640 if (castResult == SPELL_FAILED_NO_POWER)
2641 {
2642 // Not enough rage, do a regular melee attack instead
2643 meleeAttack = true;
2644 }
2645 }
2646 else
2647 {
2648 meleeSpell->cast(true);
2649 }
2650 }
2651 if (meleeAttack)
2652 {
2653 // attack can be redirected to another target
2654 victim = GetMeleeHitRedirectTarget(victim);
2655 CalcDamageInfo damageInfo;
2656 CalculateMeleeDamage(victim, &damageInfo, attType, sittingVictim);
2657
2658 // Send log damage message to client
2659 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
2660 {
2661 Unit::DealDamageMods(victim, damageInfo.damages[i].damage, &damageInfo.damages[i].absorb);
2662 }
2663
2664 // Related to sparring system. Allow attack animations even if there are no damages
2665 if (victim->CanSparringWith(damageInfo.attacker))
2666 damageInfo.HitInfo |= HITINFO_FAKE_DAMAGE;
2667
2668 SendAttackStateUpdate(&damageInfo);
2669
2670 //TriggerAurasProcOnEvent(damageInfo);
2671
2672 _lastDamagedTargetGuid = victim->GetGUID();
2673
2674 DealMeleeDamage(&damageInfo, true);
2675
2676 DamageInfo dmgInfo(damageInfo);
2677 Unit::ProcDamageAndSpell(damageInfo.attacker, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, damageInfo.procEx, dmgInfo.GetDamage(),
2678 damageInfo.attackType, nullptr, nullptr, -1, nullptr, &dmgInfo);
2679
2680 if (IsPlayer())
2681 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (Player) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2682 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2683 else
2684 LOG_DEBUG("entities.unit", "AttackerStateUpdate: (NPC) {} attacked {} for {} dmg, absorbed {}, blocked {}, resisted {}.",
2685 GetGUID().ToString(), victim->GetGUID().ToString(), dmgInfo.GetDamage(), dmgInfo.GetAbsorb(), dmgInfo.GetBlock(), dmgInfo.GetResist());
2686
2687 // Let the pet know we've started attacking someting. Handles melee attacks only
2688 // Spells such as auto-shot and others handled in WorldSession::HandleCastSpellOpcode
2689 if (IsPlayer() && !m_Controlled.empty())
2690 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
2691 if (Unit* pet = *itr)
2692 if (pet->IsAlive() && pet->IsCreature())
2693 pet->ToCreature()->AI()->OwnerAttacked(victim);
2694 }
2695}
#define MAX_ITEM_PROTO_DAMAGES
Definition ItemTemplate.h:613
@ SPELL_FAILED_NO_POWER
Definition SharedDefines.h:1034
@ AURA_INTERRUPT_FLAG_MELEE_ATTACK
Definition SpellDefines.h:55
@ UNIT_STAND_STATE_SLEEP
Definition UnitDefines.h:35
@ UNIT_STATE_CANNOT_AUTOATTACK
Definition UnitDefines.h:214
@ UNIT_FLAG_PACIFIED
Definition UnitDefines.h:267
@ HITINFO_FAKE_DAMAGE
Definition Unit.h:122
Definition Unit.h:331
std::string ToString() const
Definition ObjectGuid.cpp:47
void cast(bool skipCheck=false)
Definition Spell.cpp:3806
void SetExecutedCurrently(bool yes)
Definition Spell.h:565
void SendInterrupted(uint8 result)
Definition Spell.cpp:5198
static void SendCastResult(Player *caster, SpellInfo const *spellInfo, uint8 castCount, SpellCastResult result, SpellCustomErrors customError=SPELL_CUSTOM_ERROR_NONE)
Definition Spell.cpp:4693
void finish(bool ok=true)
Definition Spell.cpp:4501
void SendAttackStateUpdate(CalcDamageInfo *damageInfo)
Definition Unit.cpp:6566
void CombatStart(Unit *target, bool initialAggro=true)
Definition Unit.cpp:13709
Unit * GetMeleeHitRedirectTarget(Unit *victim, SpellInfo const *spellInfo=nullptr)
Definition Unit.cpp:11143
void CalculateMeleeDamage(Unit *victim, CalcDamageInfo *damageInfo, WeaponAttackType attackType=BASE_ATTACK, const bool sittingVictim=false)
Definition Unit.cpp:1490
static void ProcDamageAndSpell(Unit *actor, Unit *victim, uint32 procAttacker, uint32 procVictim, uint32 procEx, uint32 amount, WeaponAttackType attType=BASE_ATTACK, SpellInfo const *procSpellInfo=nullptr, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:6465
uint8 getStandState() const
Definition Unit.h:1695
void DealMeleeDamage(CalcDamageInfo *damageInfo, bool durabilityLoss)
Definition Unit.cpp:1855
bool CanSparringWith(Unit const *attacker) const
Definition Unit.cpp:3986
static void DealDamageMods(Unit const *victim, uint32 &damage, uint32 *absorb)
Definition Unit.cpp:814
bool IsWithinLOSInMap(WorldObject const *obj, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS, Optional< float > collisionHeight={ }, Optional< float > combatReach={ }) const
Definition Object.cpp:1340
Definition Unit.h:464
uint32 procAttacker
Definition Unit.h:481
uint32 procVictim
Definition Unit.h:482
uint32 absorb
Definition Unit.h:472
struct CalcDamageInfo::@265 damages[MAX_ITEM_PROTO_DAMAGES]
uint32 damage
Definition Unit.h:471
uint32 procEx
Definition Unit.h:483
uint32 HitInfo
Definition Unit.h:477
Unit * attacker
Definition Unit.h:465
Unit * target
Definition Unit.h:466
WeaponAttackType attackType
Definition Unit.h:480
std::string ToString() const
Definition Position.cpp:52

References _lastDamagedTargetGuid, _lastExtraAttackSpell, CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::attackType, AURA_INTERRUPT_FLAG_MELEE_ATTACK, BASE_ATTACK, CalculateMeleeDamage(), CanSparringWith(), Spell::cast(), Spell::CheckCast(), CombatStart(), CURRENT_MELEE_SPELL, CalcDamageInfo::damage, CalcDamageInfo::damages, DealDamageMods(), DealMeleeDamage(), Spell::finish(), DamageInfo::GetAbsorb(), DamageInfo::GetBlock(), DamageInfo::GetDamage(), Object::GetGUID(), Object::GetGUID(), GetMeleeHitRedirectTarget(), DamageInfo::GetResist(), getStandState(), HasUnitFlag(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_FAKE_DAMAGE, IsAlive(), Object::IsPlayer(), IsSitState(), WorldObject::IsWithinLOSInMap(), LOG_DEBUG, m_Controlled, m_currentSpells, MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, CalcDamageInfo::procAttacker, ProcDamageAndSpell(), CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RemoveAurasWithInterruptFlags(), SendAttackStateUpdate(), Spell::SendCastResult(), Spell::SendInterrupted(), Spell::SetExecutedCurrently(), SPELL_CAST_OK, SPELL_FAILED_NO_POWER, CalcDamageInfo::target, ObjectGuid::ToString(), Position::ToString(), UNIT_FLAG_PACIFIED, UNIT_STAND_STATE_SLEEP, and UNIT_STATE_CANNOT_AUTOATTACK.

Referenced by UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), HandleProcExtraAttackFor(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Player::Update(), boss_dred::boss_dredAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and boss_the_lurker_below::UpdateAI().

◆ AttackStop()

bool Unit::AttackStop ( )

Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell, AI assistance, and call SendMeleeAttackStop() to the client.

10490{
10491 if (!m_attacking)
10492 return false;
10493
10494 Unit* victim = m_attacking;
10495
10497 m_attacking = nullptr;
10498
10499 // Clear our target
10501
10503
10505
10506 // reset only at real combat stop
10507 if (Creature* creature = ToCreature())
10508 {
10509 creature->SetNoCallAssistance(false);
10510
10511 if (creature->HasSearchedAssistance())
10512 {
10513 creature->SetNoSearchAssistance(false);
10514 }
10515 }
10516
10517 SendMeleeAttackStop(victim);
10518
10519 return true;
10520}

References _removeAttacker(), ClearUnitState(), CURRENT_MELEE_SPELL, ObjectGuid::Empty, InterruptSpell(), m_attacking, SendMeleeAttackStop(), SetTarget(), Object::ToCreature(), and UNIT_STATE_MELEE_ATTACKING.

Referenced by PetAI::_stopAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CombatStop(), boss_jedoga_shadowseeker::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), advisor_baseAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_thekal::DamageTaken(), boss_viscidus::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), ScriptedAI::DoStopAttack(), Player::DuelComplete(), Spell::EffectSanctuary(), SmartAI::EnterEvadeMode(), Spell::finish(), WorldSession::HandleAttackStopOpcode(), spell_hun_scatter_shot::HandleDummy(), spell_mc_play_dead_aura::HandleEffectApply(), spell_q11065_wrangle_some_aether_rays_aura::HandleEffectApply(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetStopAttack(), RotateMovementGenerator::Initialize(), boss_janalai::JustEngagedWith(), PetAI::KilledUnit(), MotionMaster::MoveSeekAssistance(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), PetSpellFail(), RemoveCharmedBy(), boss_janalai::Reset(), boss_warbringer_omrogg::ScheduleBurningPhase(), boss_felmyst::ScheduleGroundAbilities(), boss_warbringer_omrogg::ScheduleNonBurningPhase(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_attumen::SpellHit(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_heigan::boss_heiganAI::StartFightPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), StopAttackFaction(), StopAttackingInvalidTarget(), boss_ouro::Submerge(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ BuildAuraStateUpdateForTarget()

uint32 Unit::BuildAuraStateUpdateForTarget ( Unit target) const
10623{
10625 for (AuraStateAurasMap::const_iterator itr = m_auraStateAuras.begin(); itr != m_auraStateAuras.end(); ++itr)
10626 if ((1 << (itr->first - 1)) & PER_CASTER_AURA_STATE_MASK)
10627 if (itr->second->GetBase()->GetCasterGUID() == target->GetGUID())
10628 auraStates |= (1 << (itr->first - 1));
10629
10630 return auraStates;
10631}
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:305

References Object::GetGUID(), Object::GetUInt32Value(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, and UNIT_FIELD_AURASTATE.

Referenced by PatchValuesUpdate().

◆ BuildCooldownPacket() [1/2]

void Unit::BuildCooldownPacket ( WorldPacket data,
uint8  flags,
PacketCooldowns const &  cooldowns 
)
20852{
20853 data.Initialize(SMSG_SPELL_COOLDOWN, 8 + 1 + (4 + 4) * cooldowns.size());
20854 data << GetGUID();
20855 data << uint8(flags);
20856 for (std::unordered_map<uint32, uint32>::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
20857 {
20858 data << uint32(itr->first);
20859 data << uint32(itr->second);
20860 }
20861}
void Initialize(uint16 opcode, std::size_t newres=200)
Definition WorldPacket.h:68
@ SMSG_SPELL_COOLDOWN
Definition Opcodes.h:338

References Object::GetGUID(), WorldPacket::Initialize(), and SMSG_SPELL_COOLDOWN.

◆ BuildCooldownPacket() [2/2]

◆ BuildHeartBeatMsg()

void Unit::BuildHeartBeatMsg ( WorldPacket data) const
2067{
2068 data->Initialize(MSG_MOVE_HEARTBEAT, 32);
2069 *data << GetPackGUID();
2070 BuildMovementPacket(data);
2071}
void BuildMovementPacket(ByteBuffer *data) const
Definition Unit.cpp:19719
@ MSG_MOVE_HEARTBEAT
Definition Opcodes.h:268

References BuildMovementPacket(), Object::GetPackGUID(), WorldPacket::Initialize(), and MSG_MOVE_HEARTBEAT.

Referenced by boss_volkhan::boss_volkhanAI::MovementInform(), and SendMovementFlagUpdate().

◆ BuildMovementPacket()

void Unit::BuildMovementPacket ( ByteBuffer data) const
19720{
19721 *data << uint32(GetUnitMovementFlags()); // movement flags
19722 *data << uint16(GetExtraUnitMovementFlags()); // 2.3.0
19723 *data << uint32(GameTime::GetGameTimeMS().count()); // time / counter
19724 *data << GetPositionX();
19725 *data << GetPositionY();
19726 *data << GetPositionZ();
19727 *data << GetOrientation();
19728
19729 // 0x00000200
19731 {
19732 if (m_vehicle)
19733 *data << m_vehicle->GetBase()->GetPackGUID();
19734 else if (GetTransport())
19735 *data << GetTransport()->GetPackGUID();
19736 else
19737 *data << (uint8)0;
19738
19739 *data << float (GetTransOffsetX());
19740 *data << float (GetTransOffsetY());
19741 *data << float (GetTransOffsetZ());
19742 *data << float (GetTransOffsetO());
19743 *data << uint32(GetTransTime());
19744 *data << uint8 (GetTransSeat());
19745
19748 }
19749
19750 // 0x02200000
19753 *data << (float)m_movementInfo.pitch;
19754
19755 *data << (uint32)m_movementInfo.fallTime;
19756
19757 // 0x00001000
19759 {
19760 *data << (float)m_movementInfo.jump.zspeed;
19761 *data << (float)m_movementInfo.jump.sinAngle;
19762 *data << (float)m_movementInfo.jump.cosAngle;
19763 *data << (float)m_movementInfo.jump.xyspeed;
19764 }
19765
19766 // 0x04000000
19768 *data << (float)m_movementInfo.splineElevation;
19769}
@ MOVEMENTFLAG_ONTRANSPORT
Definition UnitDefines.h:374
@ MOVEMENTFLAG_FLYING
Definition UnitDefines.h:390
@ MOVEMENTFLAG_FALLING
Definition UnitDefines.h:377
@ MOVEMENTFLAG_SWIMMING
Definition UnitDefines.h:386
@ MOVEMENTFLAG_SPLINE_ELEVATION
Definition UnitDefines.h:391
@ MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING
Definition UnitDefines.h:426
@ MOVEMENTFLAG2_INTERPOLATED_MOVEMENT
Definition UnitDefines.h:431
uint32 GetUnitMovementFlags() const
Definition Unit.h:730
uint16 GetExtraUnitMovementFlags() const
Definition Unit.h:736
float GetTransOffsetX() const
Definition Object.h:649
float GetTransOffsetY() const
Definition Object.h:650
float GetTransOffsetZ() const
Definition Object.h:651
uint32 GetTransTime() const
Definition Object.h:653
Transport * GetTransport() const
Definition Object.h:648
float GetTransOffsetO() const
Definition Object.h:652
float cosAngle
Definition Object.h:329
float xyspeed
Definition Object.h:329
float zspeed
Definition Object.h:329
float sinAngle
Definition Object.h:329
uint32 time2
Definition Object.h:312
struct MovementInfo::JumpInfo jump
uint32 fallTime
Definition Object.h:319
struct MovementInfo::TransportInfo transport
float splineElevation
Definition Object.h:333
float pitch
Definition Object.h:316

References MovementInfo::JumpInfo::cosAngle, MovementInfo::fallTime, MovementInfo::flags2, Vehicle::GetBase(), GetExtraUnitMovementFlags(), GameTime::GetGameTimeMS(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransOffsetO(), WorldObject::GetTransOffsetX(), WorldObject::GetTransOffsetY(), WorldObject::GetTransOffsetZ(), WorldObject::GetTransport(), WorldObject::GetTransSeat(), WorldObject::GetTransTime(), GetUnitMovementFlags(), MovementInfo::jump, WorldObject::m_movementInfo, m_vehicle, MOVEMENTFLAG2_ALWAYS_ALLOW_PITCHING, MOVEMENTFLAG2_INTERPOLATED_MOVEMENT, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FLYING, MOVEMENTFLAG_ONTRANSPORT, MOVEMENTFLAG_SPLINE_ELEVATION, MOVEMENTFLAG_SWIMMING, MovementInfo::pitch, MovementInfo::JumpInfo::sinAngle, MovementInfo::splineElevation, MovementInfo::TransportInfo::time2, MovementInfo::transport, MovementInfo::JumpInfo::xyspeed, and MovementInfo::JumpInfo::zspeed.

Referenced by BuildHeartBeatMsg(), Object::BuildMovementUpdate(), WorldSession::HandleMoveKnockBackAck(), Player::SendTeleportAckPacket(), SendTeleportPacket(), Player::SetCanFly(), Creature::SetCanFly(), Creature::SetDisableGravity(), Player::SetDisableGravity(), Player::SetFeatherFall(), Creature::SetFeatherFall(), Player::SetHover(), SetSpeed(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ BuildValuesUpdate()

void Unit::BuildValuesUpdate ( uint8  updateType,
ByteBuffer data,
Player target 
)
overrideprotectedvirtual

Reimplemented from Object.

20568{
20569 if (!target)
20570 return;
20571
20573 uint32 visibleFlag = UF_FLAG_PUBLIC;
20574
20575 if (target == this)
20576 visibleFlag |= UF_FLAG_PRIVATE;
20577
20579 if (GetOwnerGUID() == target->GetGUID())
20580 visibleFlag |= UF_FLAG_OWNER;
20581
20584 visibleFlag |= UF_FLAG_SPECIAL_INFO;
20585
20586 if (plr && plr->IsInSameRaidWith(target))
20587 visibleFlag |= UF_FLAG_PARTY_MEMBER;
20588
20589 uint64 cacheKey = static_cast<uint64>(visibleFlag) << 8 | updateType;
20590
20591 auto cacheIt = _valuesUpdateCache.find(cacheKey);
20592 if (cacheIt != _valuesUpdateCache.end())
20593 {
20594 int32 cachePos = static_cast<int32>(data->wpos());
20595 data->append(cacheIt->second.buffer);
20596
20597 BuildValuesCachePosPointers dataAdjustedPos = cacheIt->second.posPointers;
20598 if (cachePos)
20599 dataAdjustedPos.ApplyOffset(cachePos);
20600
20601 PatchValuesUpdate(*data, dataAdjustedPos, target);
20602
20603 return;
20604 }
20605
20606 BuildValuesCachedBuffer cacheValue(500);
20607
20608 ByteBuffer fieldBuffer(400);
20609
20610 UpdateMask updateMask;
20611 updateMask.SetCount(m_valuesCount);
20612
20613 for (uint16 index = 0; index < m_valuesCount; ++index)
20614 {
20615 if (_fieldNotifyFlags & flags[index] ||
20616 ((flags[index] & visibleFlag) & UF_FLAG_SPECIAL_INFO) ||
20617 ((updateType == UPDATETYPE_VALUES ? _changesMask.GetBit(index) : m_uint32Values[index]) && (flags[index] & visibleFlag)) ||
20619 {
20620 updateMask.SetBit(index);
20621
20622 if (index == UNIT_NPC_FLAGS)
20623 {
20624 cacheValue.posPointers.UnitNPCFlagsPos = int32(fieldBuffer.wpos());
20625 fieldBuffer << m_uint32Values[UNIT_NPC_FLAGS];
20626 }
20627 else if (index == UNIT_FIELD_AURASTATE)
20628 {
20629 cacheValue.posPointers.UnitFieldAuraStatePos = int32(fieldBuffer.wpos());
20630 fieldBuffer << uint32(0); // Fill in later.
20631 }
20632 // FIXME: Some values at server stored in float format but must be sent to client in uint32 format
20633 else if (index >= UNIT_FIELD_BASEATTACKTIME && index <= UNIT_FIELD_RANGEDATTACKTIME)
20634 {
20635 // convert from float to uint32 and send
20636 fieldBuffer << uint32(m_floatValues[index] < 0 ? 0 : m_floatValues[index]);
20637 }
20638 // there are some float values which may be negative or can't get negative due to other checks
20639 else if ((index >= UNIT_FIELD_NEGSTAT0 && index <= UNIT_FIELD_NEGSTAT4) ||
20642 (index >= UNIT_FIELD_POSSTAT0 && index <= UNIT_FIELD_POSSTAT4))
20643 {
20644 fieldBuffer << uint32(m_floatValues[index]);
20645 }
20646 // Gamemasters should be always able to select units - remove not selectable flag
20647 else if (index == UNIT_FIELD_FLAGS)
20648 {
20649 cacheValue.posPointers.UnitFieldFlagsPos = int32(fieldBuffer.wpos());
20650 fieldBuffer << m_uint32Values[UNIT_FIELD_FLAGS];
20651 }
20652 // use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures
20653 else if (index == UNIT_FIELD_DISPLAYID)
20654 {
20655 cacheValue.posPointers.UnitFieldDisplayPos = int32(fieldBuffer.wpos());
20656 fieldBuffer << m_uint32Values[UNIT_FIELD_DISPLAYID];
20657 }
20658 else if (index == UNIT_DYNAMIC_FLAGS)
20659 {
20660 cacheValue.posPointers.UnitDynamicFlagsPos = int32(fieldBuffer.wpos());
20662 fieldBuffer << dynamicFlags;
20663 }
20664 else if (index == UNIT_FIELD_BYTES_2)
20665 {
20666 cacheValue.posPointers.UnitFieldBytes2Pos = int32(fieldBuffer.wpos());
20667 fieldBuffer << m_uint32Values[index];
20668 }
20669 else if (index == UNIT_FIELD_FACTIONTEMPLATE)
20670 {
20671 cacheValue.posPointers.UnitFieldFactionTemplatePos = int32(fieldBuffer.wpos());
20672 fieldBuffer << m_uint32Values[index];
20673 }
20674 else
20675 {
20676 if (sScriptMgr->ShouldTrackValuesUpdatePosByIndex(this, updateType, index))
20677 cacheValue.posPointers.other[index] = static_cast<uint32>(fieldBuffer.wpos());
20678
20679 // send in current format (float as float, uint32 as uint32)
20680 fieldBuffer << m_uint32Values[index];
20681 }
20682 }
20683 }
20684
20685 cacheValue.buffer << uint8(updateMask.GetBlockCount());
20686 updateMask.AppendToPacket(&cacheValue.buffer);
20687 int32 fieldBufferPos = static_cast<int32>(cacheValue.buffer.wpos());
20688 cacheValue.buffer.append(fieldBuffer);
20689 cacheValue.posPointers.ApplyOffset(fieldBufferPos);
20690
20691 int32 cachePos = static_cast<int32>(data->wpos());
20692 data->append(cacheValue.buffer);
20693
20694 BuildValuesCachePosPointers dataAdjustedPos = cacheValue.posPointers;
20695 if (cachePos)
20696 dataAdjustedPos.ApplyOffset(cachePos);
20697
20698 PatchValuesUpdate(*data, dataAdjustedPos, target);
20699
20700 _valuesUpdateCache.insert(std::pair<uint64, BuildValuesCachedBuffer>(cacheKey, std::move(cacheValue)));
20701}
std::uint64_t uint64
Definition Define.h:106
@ UNIT_DYNFLAG_SPECIALINFO
Definition SharedDefines.h:3364
@ UNIT_DYNFLAG_TAPPED_BY_PLAYER
Definition SharedDefines.h:3363
@ UNIT_DYNFLAG_TAPPED
Definition SharedDefines.h:3362
@ SPELL_AURA_EMPATHY
Definition SpellAuraDefines.h:184
@ UPDATETYPE_VALUES
Definition UpdateData.h:28
uint32 UnitUpdateFieldFlags[PLAYER_END]
Definition UpdateFieldFlags.cpp:162
@ UF_FLAG_SPECIAL_INFO
Definition UpdateFieldFlags.h:32
@ UF_FLAG_PUBLIC
Definition UpdateFieldFlags.h:27
@ UF_FLAG_OWNER
Definition UpdateFieldFlags.h:29
@ UF_FLAG_PRIVATE
Definition UpdateFieldFlags.h:28
@ UF_FLAG_PARTY_MEMBER
Definition UpdateFieldFlags.h:33
@ UNIT_NPC_FLAGS
Definition UpdateFields.h:139
@ UNIT_FIELD_RANGEDATTACKTIME
Definition UpdateFields.h:121
@ UNIT_FIELD_DISPLAYID
Definition UpdateFields.h:124
@ UNIT_FIELD_FACTIONTEMPLATE
Definition UpdateFields.h:115
@ UNIT_FIELD_POSSTAT4
Definition UpdateFields.h:150
@ UNIT_FIELD_NEGSTAT4
Definition UpdateFields.h:155
@ UNIT_FIELD_FLAGS
Definition UpdateFields.h:117
@ UNIT_DYNAMIC_FLAGS
Definition UpdateFields.h:136
Definition ByteBuffer.h:70
void append(T value)
Definition ByteBuffer.h:129
std::size_t wpos() const
Definition ByteBuffer.h:330
uint16 _fieldNotifyFlags
Definition Object.h:268
bool HasDynamicFlag(uint32 flag) const
Definition Object.h:123
UpdateMask _changesMask
Definition Object.h:264
uint32 * m_uint32Values
Definition Object.h:260
uint16 m_valuesCount
Definition Object.h:266
float * m_floatValues
Definition Object.h:261
bool IsInSameRaidWith(Player const *p) const
Definition Player.h:1899
ValuesUpdateCache _valuesUpdateCache
Definition Unit.h:2176
Player * GetCharmerOrOwnerPlayerOrPlayerItself() const
Definition Unit.cpp:10702
bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const
Definition Unit.cpp:5789
ObjectGuid GetOwnerGUID() const
Definition Unit.h:668
void PatchValuesUpdate(ByteBuffer &valuesUpdateBuf, BuildValuesCachePosPointers &posPointers, Player *target)
Definition Unit.cpp:20703
Definition UpdateMask.h:25
uint32 GetBlockCount() const
Definition UpdateMask.h:62
bool GetBit(uint32 index) const
Definition UpdateMask.h:47
void SetCount(uint32 valuesCount)
Definition UpdateMask.h:65
void SetBit(uint32 index)
Definition UpdateMask.h:45
void AppendToPacket(ByteBuffer *data)
Definition UpdateMask.h:49
Definition UnitUtils.h:65
void ApplyOffset(uint32 offset)
Definition UnitUtils.h:70
Definition UnitUtils.h:110

References Object::_changesMask, Object::_fieldNotifyFlags, _valuesUpdateCache, ByteBuffer::append(), UpdateMask::AppendToPacket(), BuildValuesCachePosPointers::ApplyOffset(), BuildValuesCachedBuffer::buffer, UpdateMask::GetBit(), UpdateMask::GetBlockCount(), GetCharmerOrOwnerPlayerOrPlayerItself(), Object::GetGUID(), GetOwnerGUID(), HasAuraTypeWithCaster(), Object::HasDynamicFlag(), Object::HasFlag(), Player::IsInSameRaidWith(), Object::m_floatValues, Object::m_uint32Values, Object::m_valuesCount, BuildValuesCachePosPointers::other, PatchValuesUpdate(), PER_CASTER_AURA_STATE_MASK, BuildValuesCachedBuffer::posPointers, UpdateMask::SetBit(), UpdateMask::SetCount(), SPELL_AURA_EMPATHY, sScriptMgr, UF_FLAG_OWNER, UF_FLAG_PARTY_MEMBER, UF_FLAG_PRIVATE, UF_FLAG_PUBLIC, UF_FLAG_SPECIAL_INFO, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_SPECIALINFO, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_FIELD_AURASTATE, UNIT_FIELD_BASEATTACKTIME, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FACTIONTEMPLATE, UNIT_FIELD_FLAGS, UNIT_FIELD_NEGSTAT0, UNIT_FIELD_NEGSTAT4, UNIT_FIELD_POSSTAT0, UNIT_FIELD_POSSTAT4, UNIT_FIELD_RANGEDATTACKTIME, UNIT_FIELD_RESISTANCEBUFFMODSNEGATIVE, UNIT_FIELD_RESISTANCEBUFFMODSPOSITIVE, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, BuildValuesCachePosPointers::UnitNPCFlagsPos, UnitUpdateFieldFlags, UPDATETYPE_VALUES, and ByteBuffer::wpos().

◆ CalcAbsorbResist()

void Unit::CalcAbsorbResist ( DamageInfo dmgInfo,
bool  Splited = false 
)
static
2174{
2175 Unit* victim = dmgInfo.GetVictim();
2176 Unit* attacker = dmgInfo.GetAttacker();
2177 uint32 damage = dmgInfo.GetDamage();
2178 SpellSchoolMask schoolMask = dmgInfo.GetSchoolMask();
2179 SpellInfo const* spellInfo = dmgInfo.GetSpellInfo();
2180
2181 if (!victim || !victim->IsAlive() || !damage)
2182 return;
2183
2184 // Magic damage, check for resists
2185 // Ignore spells that cant be resisted
2186 // Xinef: holy resistance exists for npcs
2187 if (!(schoolMask & SPELL_SCHOOL_MASK_NORMAL) && (!(schoolMask & SPELL_SCHOOL_MASK_HOLY) || victim->IsCreature()) && (!spellInfo || (!spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))))
2188 {
2189 float averageResist = Unit::GetEffectiveResistChance(attacker, schoolMask, victim);
2190
2191 float discreteResistProbability[11];
2192 for (uint32 i = 0; i < 11; ++i)
2193 {
2194 discreteResistProbability[i] = 0.5f - 2.5f * std::fabs(0.1f * i - averageResist);
2195 if (discreteResistProbability[i] < 0.0f)
2196 discreteResistProbability[i] = 0.0f;
2197 }
2198
2199 if (averageResist <= 0.1f)
2200 {
2201 discreteResistProbability[0] = 1.0f - 7.5f * averageResist;
2202 discreteResistProbability[1] = 5.0f * averageResist;
2203 discreteResistProbability[2] = 2.5f * averageResist;
2204 }
2205
2206 float r = float(rand_norm());
2207 uint32 i = 0;
2208 float probabilitySum = discreteResistProbability[0];
2209
2210 while (r >= probabilitySum && i < 10)
2211 probabilitySum += discreteResistProbability[++i];
2212
2213 float damageResisted = float(damage * i / 10);
2214
2215 if (damageResisted) // if equal to 0, checking these is pointless
2216 {
2217 if (attacker)
2218 {
2220 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2221 if (((*j)->GetMiscValue() & schoolMask) && (*j)->IsAffectedOnSpell(spellInfo))
2222 AddPct(damageResisted, -(*j)->GetAmount());
2223
2225 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2226 if ((*j)->GetMiscValue() & schoolMask)
2227 AddPct(damageResisted, -(*j)->GetAmount());
2228 }
2229
2230 // pussywizard:
2231 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC))
2232 {
2233 uint32 damageAfterArmor = Unit::CalcArmorReducedDamage(attacker, victim, damage, spellInfo, 0, BASE_ATTACK);
2234 uint32 armorReduction = damage - damageAfterArmor;
2235 if (armorReduction < damageResisted) // pick the lower one, the weakest resistance counts
2236 damageResisted = armorReduction;
2237 }
2238 }
2239
2240 dmgInfo.ResistDamage(uint32(damageResisted));
2241 }
2242
2243 // Ignore Absorption Auras
2244 float auraAbsorbMod = 0;
2245 if (attacker)
2246 {
2248 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasA.begin(); itr != AbsIgnoreAurasA.end(); ++itr)
2249 {
2250 if (!((*itr)->GetMiscValue() & schoolMask))
2251 continue;
2252
2253 if ((*itr)->GetAmount() > auraAbsorbMod)
2254 auraAbsorbMod = float((*itr)->GetAmount());
2255 }
2256
2258 for (AuraEffectList::const_iterator itr = AbsIgnoreAurasB.begin(); itr != AbsIgnoreAurasB.end(); ++itr)
2259 {
2260 if (!((*itr)->GetMiscValue() & schoolMask))
2261 continue;
2262
2263 if (((*itr)->GetAmount() > auraAbsorbMod) && (*itr)->IsAffectedOnSpell(spellInfo))
2264 auraAbsorbMod = float((*itr)->GetAmount());
2265 }
2266 RoundToInterval(auraAbsorbMod, 0.0f, 100.0f);
2267 }
2268
2269 // We're going to call functions which can modify content of the list during iteration over it's elements
2270 // Let's copy the list so we can prevent iterator invalidation
2272 std::sort(vSchoolAbsorbCopy.begin(), vSchoolAbsorbCopy.end(), Acore::AbsorbAuraOrderPred());
2273
2274 // absorb without mana cost
2275 for (AuraEffectList::iterator itr = vSchoolAbsorbCopy.begin(); (itr != vSchoolAbsorbCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2276 {
2277 AuraEffect* absorbAurEff = *itr;
2278 // Check if aura was removed during iteration - we don't need to work on such auras
2279 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2280 if (!aurApp)
2281 continue;
2282 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2283 continue;
2284
2285 // get amount which can be still absorbed by the aura
2286 int32 currentAbsorb = absorbAurEff->GetAmount();
2287 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2288 if (currentAbsorb < 0)
2289 currentAbsorb = 0;
2290
2291 uint32 tempAbsorb = uint32(currentAbsorb);
2292
2293 bool defaultPrevented = false;
2294
2295 absorbAurEff->GetBase()->CallScriptEffectAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2296 currentAbsorb = tempAbsorb;
2297
2298 if (defaultPrevented)
2299 continue;
2300
2301 // absorb must be smaller than the damage itself
2302 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2303
2304 // xinef: do this after absorb is rounded to damage...
2305 AddPct(currentAbsorb, -auraAbsorbMod);
2306
2307 dmgInfo.AbsorbDamage(currentAbsorb);
2308
2309 tempAbsorb = currentAbsorb;
2310 absorbAurEff->GetBase()->CallScriptEffectAfterAbsorbHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2311
2312 // Check if our aura is using amount to count damage
2313 if (absorbAurEff->GetAmount() >= 0)
2314 {
2315 // Reduce shield amount
2316 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2317 // Aura cannot absorb anything more - remove it
2318 if (absorbAurEff->GetAmount() <= 0)
2319 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2320 }
2321 }
2322
2323 // absorb by mana cost
2325 for (AuraEffectList::const_iterator itr = vManaShieldCopy.begin(); (itr != vManaShieldCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2326 {
2327 AuraEffect* absorbAurEff = *itr;
2328 // Check if aura was removed during iteration - we don't need to work on such auras
2329 AuraApplication const* aurApp = absorbAurEff->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2330 if (!aurApp)
2331 continue;
2332 // check damage school mask
2333 if (!(absorbAurEff->GetMiscValue() & schoolMask))
2334 continue;
2335
2336 // get amount which can be still absorbed by the aura
2337 int32 currentAbsorb = absorbAurEff->GetAmount();
2338 // aura with infinite absorb amount - let the scripts handle absorbtion amount, set here to 0 for safety
2339 if (currentAbsorb < 0)
2340 currentAbsorb = 0;
2341
2342 uint32 tempAbsorb = currentAbsorb;
2343
2344 bool defaultPrevented = false;
2345
2346 absorbAurEff->GetBase()->CallScriptEffectManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb, defaultPrevented);
2347 currentAbsorb = tempAbsorb;
2348
2349 if (defaultPrevented)
2350 continue;
2351
2352 // absorb must be smaller than the damage itself
2353 currentAbsorb = RoundToInterval(currentAbsorb, 0, int32(dmgInfo.GetDamage()));
2354
2355 // xinef: do this after absorb is rounded to damage...
2356 AddPct(currentAbsorb, -auraAbsorbMod);
2357
2358 int32 manaReduction = currentAbsorb;
2359
2360 // lower absorb amount by talents
2361 if (float manaMultiplier = absorbAurEff->GetSpellInfo()->Effects[absorbAurEff->GetEffIndex()].CalcValueMultiplier(absorbAurEff->GetCaster()))
2362 manaReduction = int32(float(manaReduction) * manaMultiplier);
2363
2364 int32 manaTaken = -victim->ModifyPower(POWER_MANA, -manaReduction);
2365
2366 // take case when mana has ended up into account
2367 currentAbsorb = currentAbsorb ? int32(float(currentAbsorb) * (float(manaTaken) / float(manaReduction))) : 0;
2368
2369 dmgInfo.AbsorbDamage(currentAbsorb);
2370
2371 tempAbsorb = currentAbsorb;
2372 absorbAurEff->GetBase()->CallScriptEffectAfterManaShieldHandlers(absorbAurEff, aurApp, dmgInfo, tempAbsorb);
2373
2374 // Check if our aura is using amount to count damage
2375 if (absorbAurEff->GetAmount() >= 0)
2376 {
2377 absorbAurEff->SetAmount(absorbAurEff->GetAmount() - currentAbsorb);
2378 if ((absorbAurEff->GetAmount() <= 0))
2379 absorbAurEff->GetBase()->Remove(AURA_REMOVE_BY_ENEMY_SPELL);
2380 }
2381 }
2382
2383 // split damage auras - only when not damaging self
2384 // Xinef: not true - Warlock Hellfire
2385 if (/*victim != attacker &&*/ !Splited)
2386 {
2387 // We're going to call functions which can modify content of the list during iteration over it's elements
2388 // Let's copy the list so we can prevent iterator invalidation
2389 AuraEffectList vSplitDamageFlatCopy(victim->GetAuraEffectsByType(SPELL_AURA_SPLIT_DAMAGE_FLAT)); // Not used by any spell
2390 for (AuraEffectList::iterator itr = vSplitDamageFlatCopy.begin(); (itr != vSplitDamageFlatCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2391 {
2392 // Check if aura was removed during iteration - we don't need to work on such auras
2393 if (!((*itr)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
2394 continue;
2395 // check damage school mask
2396 if (!((*itr)->GetMiscValue() & schoolMask))
2397 continue;
2398
2399 // Damage can be splitted only if aura has an alive caster
2400 Unit* caster = (*itr)->GetCaster();
2401 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2402 continue;
2403
2404 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2405 // Ignore LOS attribute is only used for the cast portion of the spell
2406 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2407 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2408 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2409 continue;
2410
2411 int32 splitDamage = (*itr)->GetAmount();
2412
2413 // absorb must be smaller than the damage itself
2414 splitDamage = RoundToInterval(splitDamage, 0, int32(dmgInfo.GetDamage()));
2415
2416 dmgInfo.AbsorbDamage(splitDamage);
2417
2418 uint32 splitted = splitDamage;
2419 uint32 splitted_absorb = 0;
2420 uint32 splitted_resist = 0;
2421
2422 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2423 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, schoolMask, dmgInfo.GetDamageType());
2424 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2425 {
2426 procEx |= PROC_EX_IMMUNE;
2427 splittedDmgInfo.AbsorbDamage(splitted);
2428 }
2429 else
2430 {
2431 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2432 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2433 }
2434
2435 splitted_absorb = splittedDmgInfo.GetAbsorb();
2436 splitted_resist = splittedDmgInfo.GetResist();
2437 splitted = splittedDmgInfo.GetDamage();
2438
2439 // create procs
2440 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2441 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted, nullptr, -1, nullptr, &splittedDmgInfo);
2442
2443 if (attacker)
2444 {
2445 attacker->SendSpellNonMeleeDamageLog(caster, (*itr)->GetSpellInfo(), splitted, schoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2446 }
2447
2448 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2449 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, schoolMask, (*itr)->GetSpellInfo(), false);
2450 }
2451
2452 // We're going to call functions which can modify content of the list during iteration over it's elements
2453 // Let's copy the list so we can prevent iterator invalidation
2455 for (AuraEffectList::iterator itr = vSplitDamagePctCopy.begin(); (itr != vSplitDamagePctCopy.end()) && (dmgInfo.GetDamage() > 0); ++itr)
2456 {
2457 // Check if aura was removed during iteration - we don't need to work on such auras
2458 AuraApplication const* aurApp = (*itr)->GetBase()->GetApplicationOfTarget(victim->GetGUID());
2459 if (!aurApp)
2460 continue;
2461
2462 // check damage school mask
2463 if (!((*itr)->GetMiscValue() & schoolMask))
2464 continue;
2465
2466 // Damage can be splitted only if aura has an alive caster
2467 Unit* caster = (*itr)->GetCaster();
2468 if (!caster || (caster == victim) || !caster->IsInWorld() || !caster->IsAlive())
2469 continue;
2470
2471 // Limit effect range to spell's cast range. (Only for single target auras, AreaAuras don't need it)
2472 // Ignore LOS attribute is only used for the cast portion of the spell
2473 SpellInfo const* splitSpellInfo = (*itr)->GetSpellInfo();
2474 if (!splitSpellInfo->Effects[(*itr)->GetEffIndex()].IsAreaAuraEffect())
2475 if (!caster->IsWithinDist(victim, splitSpellInfo->GetMaxRange(splitSpellInfo->IsPositive(), caster)))
2476 continue;
2477
2478 uint32 splitDamage = CalculatePct(dmgInfo.GetDamage(), (*itr)->GetAmount());
2479 SpellSchoolMask splitSchoolMask = schoolMask;
2480
2481 (*itr)->GetBase()->CallScriptEffectSplitHandlers(*itr, aurApp, dmgInfo, splitDamage);
2482
2483 // absorb must be smaller than the damage itself
2484 splitDamage = RoundToInterval(splitDamage, uint32(0), uint32(dmgInfo.GetDamage()));
2485
2486 // Roar of Sacrifice, dont absorb it
2487 if (splitSpellInfo->Id != 53480)
2488 dmgInfo.AbsorbDamage(splitDamage);
2489 else
2490 splitSchoolMask = SPELL_SCHOOL_MASK_NATURE;
2491
2492 uint32 splitted = splitDamage;
2493 uint32 splitted_absorb = 0;
2494 uint32 splitted_resist = 0;
2495
2496 uint32 procAttacker = 0, procVictim = 0, procEx = PROC_EX_NORMAL_HIT;
2497 DamageInfo splittedDmgInfo(attacker, caster, splitted, spellInfo, splitSchoolMask, dmgInfo.GetDamageType());
2498 if (caster->IsImmunedToDamageOrSchool(schoolMask))
2499 {
2500 procEx |= PROC_EX_IMMUNE;
2501 splittedDmgInfo.AbsorbDamage(splitted);
2502 }
2503 else
2504 {
2505 Unit::CalcAbsorbResist(splittedDmgInfo, true);
2506 Unit::DealDamageMods(caster, splitted, &splitted_absorb);
2507 }
2508
2509 splitted_absorb = splittedDmgInfo.GetAbsorb();
2510 splitted_resist = splittedDmgInfo.GetResist();
2511 splitted = splittedDmgInfo.GetDamage();
2512
2513 // create procs
2514 createProcFlags(spellInfo, BASE_ATTACK, false, procAttacker, procVictim);
2515 caster->ProcDamageAndSpellFor(true, attacker, procVictim, procEx, BASE_ATTACK, spellInfo, splitted);
2516
2517 if (attacker)
2518 {
2519 attacker->SendSpellNonMeleeDamageLog(caster, splitSpellInfo, splitted, splitSchoolMask, splitted_absorb, splitted_resist, false, 0, false, true);
2520 }
2521
2522 CleanDamage cleanDamage = CleanDamage(splitted, 0, BASE_ATTACK, MELEE_HIT_NORMAL);
2523 Unit::DealDamage(attacker, caster, splitted, &cleanDamage, DIRECT_DAMAGE, splitSchoolMask, splitSpellInfo, false);
2524 }
2525 }
2526}
double rand_norm()
Definition Random.cpp:85
@ POWER_MANA
Definition SharedDefines.h:269
@ SPELL_ATTR4_NO_CAST_LOG
Definition SharedDefines.h:530
SpellSchoolMask
Definition SharedDefines.h:295
@ SPELL_SCHOOL_MASK_NORMAL
Definition SharedDefines.h:297
@ SPELL_SCHOOL_MASK_NATURE
Definition SharedDefines.h:300
@ SPELL_SCHOOL_MASK_HOLY
Definition SharedDefines.h:298
@ SPELL_AURA_MANA_SHIELD
Definition SpellAuraDefines.h:160
@ SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL
Definition SpellAuraDefines.h:257
@ SPELL_AURA_MOD_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:332
@ SPELL_AURA_SPLIT_DAMAGE_FLAT
Definition SpellAuraDefines.h:216
@ SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL
Definition SpellAuraDefines.h:258
@ SPELL_AURA_SPLIT_DAMAGE_PCT
Definition SpellAuraDefines.h:144
@ SPELL_AURA_SCHOOL_ABSORB
Definition SpellAuraDefines.h:132
@ SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST
Definition SpellAuraDefines.h:333
@ AURA_REMOVE_BY_ENEMY_SPELL
Definition SpellAuraDefines.h:394
@ SPELL_ATTR0_CU_BINARY_SPELL
Definition SpellInfo.h:196
@ SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC
Definition SpellInfo.h:199
@ PROC_EX_NORMAL_HIT
Definition SpellMgr.h:194
@ PROC_EX_IMMUNE
Definition SpellMgr.h:202
void createProcFlags(SpellInfo const *spellInfo, WeaponAttackType attackType, bool positive, uint32 &procAttacker, uint32 &procVictim)
Definition Unit.cpp:15996
@ DIRECT_DAMAGE
Definition Unit.h:249
@ MELEE_HIT_NORMAL
Definition Unit.h:287
T AddPct(T &base, U pct)
Definition Util.h:67
T RoundToInterval(T &num, T floor, T ceil)
Definition Util.h:79
Definition SpellAuraEffects.h:350
Definition SpellAuraEffects.h:39
SpellInfo const * GetSpellInfo() const
Definition SpellAuraEffects.h:54
void SetAmount(int32 amount)
Definition SpellAuraEffects.h:66
Unit * GetCaster() const
Definition SpellAuraEffects.h:47
int32 GetMiscValue() const
Definition SpellAuraEffects.cpp:443
Aura * GetBase() const
Definition SpellAuraEffects.h:49
uint32 GetEffIndex() const
Definition SpellAuraEffects.h:56
int32 GetAmount() const
Definition SpellAuraEffects.h:64
void CallScriptEffectAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2559
void CallScriptEffectAfterAbsorbHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2577
void CallScriptEffectManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount, bool &defaultPrevented)
Definition SpellAuras.cpp:2591
void CallScriptEffectAfterManaShieldHandlers(AuraEffect *aurEff, AuraApplication const *aurApp, DamageInfo &dmgInfo, uint32 &absorbAmount)
Definition SpellAuras.cpp:2605
virtual void Remove(AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)=0
void ResistDamage(uint32 amount)
Definition Unit.cpp:159
void AbsorbDamage(uint32 amount)
Definition Unit.cpp:152
Unit * GetVictim() const
Definition Unit.h:360
Unit * GetAttacker() const
Definition Unit.h:359
SpellInfo const * GetSpellInfo() const
Definition Unit.h:361
DamageEffectType GetDamageType() const
Definition Unit.h:363
SpellSchoolMask GetSchoolMask() const
Definition Unit.h:362
uint32 GetDamage() const
Definition Unit.h:365
std::array< SpellEffectInfo, MAX_SPELL_EFFECTS > Effects
Definition SpellInfo.h:393
float GetMaxRange(bool positive=false, Unit *caster=nullptr, Spell *spell=nullptr) const
Definition SpellInfo.cpp:2335
bool IsPositive() const
Definition SpellInfo.cpp:1237
int32 ModifyPower(Powers power, int32 val, bool withPowerUpdate=true)
Definition Unit.cpp:14239
AuraEffectList const & GetAuraEffectsByType(AuraType type) const
Definition Unit.h:1351
std::vector< AuraEffect * > AuraEffectList
Definition Unit.h:636
static uint32 CalcArmorReducedDamage(Unit const *attacker, Unit const *victim, const uint32 damage, SpellInfo const *spellInfo, uint8 attackerLevel=0, WeaponAttackType attackType=MAX_ATTACK)
Definition Unit.cpp:2057
static float GetEffectiveResistChance(Unit const *owner, SpellSchoolMask schoolMask, Unit const *victim)
Definition Unit.cpp:2139
void SendSpellNonMeleeDamageLog(SpellNonMeleeDamage *log)
Definition Unit.cpp:6397
void ProcDamageAndSpellFor(bool isVictim, Unit *target, uint32 procFlag, uint32 procExtra, WeaponAttackType attType, SpellInfo const *procSpellInfo, uint32 damage, SpellInfo const *procAura=nullptr, int8 procAuraEffectIndex=-1, Spell const *procSpell=nullptr, DamageInfo *damageInfo=nullptr, HealInfo *healInfo=nullptr, uint32 procPhase=2)
Definition Unit.cpp:16130
bool IsImmunedToDamageOrSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12984
static void CalcAbsorbResist(DamageInfo &dmgInfo, bool Splited=false)
Definition Unit.cpp:2173
static uint32 DealDamage(Unit *attacker, Unit *victim, uint32 damage, CleanDamage const *cleanDamage=nullptr, DamageEffectType damagetype=DIRECT_DAMAGE, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL, SpellInfo const *spellProto=nullptr, bool durabilityLoss=true, bool allowGM=false, Spell const *spell=nullptr)
Definition Unit.cpp:824
bool IsWithinDist(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1309
Definition Unit.h:316

References DamageInfo::AbsorbDamage(), AddPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculatePct(), Aura::CallScriptEffectAbsorbHandlers(), Aura::CallScriptEffectAfterAbsorbHandlers(), Aura::CallScriptEffectAfterManaShieldHandlers(), Aura::CallScriptEffectManaShieldHandlers(), createProcFlags(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, SpellInfo::Effects, DamageInfo::GetAbsorb(), AuraEffect::GetAmount(), Aura::GetApplicationOfTarget(), DamageInfo::GetAttacker(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraApplication::GetBase(), AuraEffect::GetCaster(), DamageInfo::GetDamage(), DamageInfo::GetDamageType(), GetEffectiveResistChance(), AuraEffect::GetEffIndex(), Object::GetGUID(), SpellInfo::GetMaxRange(), AuraEffect::GetMiscValue(), DamageInfo::GetResist(), DamageInfo::GetSchoolMask(), DamageInfo::GetSpellInfo(), AuraEffect::GetSpellInfo(), DamageInfo::GetVictim(), SpellInfo::HasAttribute(), SpellInfo::Id, IsAlive(), Object::IsCreature(), IsImmunedToDamageOrSchool(), Object::IsInWorld(), SpellInfo::IsPositive(), WorldObject::IsWithinDist(), MELEE_HIT_NORMAL, ModifyPower(), POWER_MANA, PROC_EX_IMMUNE, PROC_EX_NORMAL_HIT, ProcDamageAndSpellFor(), rand_norm(), Aura::Remove(), DamageInfo::ResistDamage(), RoundToInterval(), SendSpellNonMeleeDamageLog(), AuraEffect::SetAmount(), SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR0_CU_SCHOOLMASK_NORMAL_WITH_MAGIC, SPELL_ATTR4_NO_CAST_LOG, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_ABILITY_ABSORB_SCHOOL, SPELL_AURA_MOD_TARGET_ABSORB_SCHOOL, SPELL_AURA_SCHOOL_ABSORB, SPELL_AURA_SPLIT_DAMAGE_FLAT, SPELL_AURA_SPLIT_DAMAGE_PCT, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NATURE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), DealDamage(), DealMeleeDamage(), Player::EnvironmentalDamage(), spell_valkyr_touch_aura::HandleEffectPeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcArmorReducedDamage()

uint32 Unit::CalcArmorReducedDamage ( Unit const *  attacker,
Unit const *  victim,
const uint32  damage,
SpellInfo const *  spellInfo,
uint8  attackerLevel = 0,
WeaponAttackType  attackType = MAX_ATTACK 
)
static
2058{
2059 float armor = float(victim->GetArmor());
2060
2061 // Ignore enemy armor by SPELL_AURA_MOD_TARGET_RESISTANCE aura
2062 if (attacker)
2063 {
2064 armor += attacker->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL);
2065
2066 if (spellInfo)
2067 if (Player* modOwner = attacker->GetSpellModOwner())
2068 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_IGNORE_ARMOR, armor);
2069
2070 AuraEffectList const& ResIgnoreAurasAb = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST);
2071 for (AuraEffectList::const_iterator j = ResIgnoreAurasAb.begin(); j != ResIgnoreAurasAb.end(); ++j)
2072 {
2073 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL
2074 && (*j)->IsAffectedOnSpell(spellInfo))
2075 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2076 }
2077
2078 AuraEffectList const& ResIgnoreAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_IGNORE_TARGET_RESIST);
2079 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
2080 {
2081 if ((*j)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
2082 armor = std::floor(AddPct(armor, -(*j)->GetAmount()));
2083 }
2084
2085 // Apply Player CR_ARMOR_PENETRATION rating and buffs from stances\specializations etc.
2086 if (attacker->IsPlayer())
2087 {
2088 float bonusPct = 0;
2089 AuraEffectList const& armorPenAuras = attacker->GetAuraEffectsByType(SPELL_AURA_MOD_ARMOR_PENETRATION_PCT);
2090 for (AuraEffectList::const_iterator itr = armorPenAuras.begin(); itr != armorPenAuras.end(); ++itr)
2091 {
2092 if ((*itr)->GetSpellInfo()->EquippedItemClass == -1)
2093 {
2094 if (!spellInfo || (*itr)->IsAffectedOnSpell(spellInfo) || (*itr)->GetMiscValue() & spellInfo->GetSchoolMask())
2095 bonusPct += (*itr)->GetAmount();
2096 else if (!(*itr)->GetMiscValue() && !(*itr)->HasSpellClassMask())
2097 bonusPct += (*itr)->GetAmount();
2098 }
2099 else
2100 {
2101 if (attacker->ToPlayer()->HasItemFitToSpellRequirements((*itr)->GetSpellInfo()))
2102 bonusPct += (*itr)->GetAmount();
2103 }
2104 }
2105
2106 float maxArmorPen = 0;
2107 if (victim->GetLevel() < 60)
2108 maxArmorPen = float(400 + 85 * victim->GetLevel());
2109 else
2110 maxArmorPen = 400 + 85 * victim->GetLevel() + 4.5f * 85 * (victim->GetLevel() - 59);
2111
2112 // Cap armor penetration to this number
2113 maxArmorPen = std::min((armor + maxArmorPen) / 3, armor);
2114 // Figure out how much armor do we ignore
2115 float armorPen = CalculatePct(maxArmorPen, bonusPct + attacker->ToPlayer()->GetRatingBonusValue(CR_ARMOR_PENETRATION));
2116 // Got the value, apply it
2117 armor -= std::min(armorPen, maxArmorPen);
2118 }
2119 }
2120
2121 if (armor < 0.0f)
2122 armor = 0.0f;
2123
2124 float levelModifier = attacker ? attacker->GetLevel() : attackerLevel;
2125 if (levelModifier > 59)
2126 levelModifier = levelModifier + (4.5f * (levelModifier - 59));
2127
2128 float tmpvalue = 0.1f * armor / (8.5f * levelModifier + 40);
2129 tmpvalue = tmpvalue / (1.0f + tmpvalue);
2130
2131 if (tmpvalue < 0.0f)
2132 tmpvalue = 0.0f;
2133 if (tmpvalue > 0.75f)
2134 tmpvalue = 0.75f;
2135
2136 return uint32(std::ceil(std::max(damage * (1.0f - tmpvalue), 0.0f)));
2137}
@ SPELL_AURA_MOD_ARMOR_PENETRATION_PCT
Definition SpellAuraDefines.h:343
@ SPELL_AURA_MOD_TARGET_RESISTANCE
Definition SpellAuraDefines.h:186
@ SPELLMOD_IGNORE_ARMOR
Definition SpellDefines.h:89
@ CR_ARMOR_PENETRATION
Definition Unit.h:242

References AddPct(), CalculatePct(), CR_ARMOR_PENETRATION, GetArmor(), GetAuraEffectsByType(), GetLevel(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), Player::HasItemFitToSpellRequirements(), SpellInfo::Id, Object::IsPlayer(), SPELL_AURA_MOD_ABILITY_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_ARMOR_PENETRATION_PCT, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_TARGET_RESISTANCE, SPELL_SCHOOL_MASK_NORMAL, SPELLMOD_IGNORE_ARMOR, and Object::ToPlayer().

Referenced by CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), boss_priestess_lackey_commonAI::GetThreatMod(), boss_faction_championsAI::GetThreatMod(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ CalcHealAbsorb()

void Unit::CalcHealAbsorb ( HealInfo healInfo)
static
2529{
2530 if (!healInfo.GetHeal())
2531 return;
2532
2533 int32 const healing = static_cast<int32>(healInfo.GetHeal());
2534 int32 absorbAmount = 0;
2535
2536 // Need remove expired auras after
2537 bool existExpired = false;
2538
2539 // absorb without mana cost
2541 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end() && absorbAmount <= healing; ++i)
2542 {
2543 if (!((*i)->GetMiscValue() & healInfo.GetSpellInfo()->SchoolMask))
2544 continue;
2545
2546 // Max Amount can be absorbed by this aura
2547 int32 currentAbsorb = (*i)->GetAmount();
2548
2549 // Found empty aura (impossible but..)
2550 if (currentAbsorb <= 0)
2551 {
2552 existExpired = true;
2553 continue;
2554 }
2555
2556 // currentAbsorb - damage can be absorbed by shield
2557 // If need absorb less damage
2558 if (healing < currentAbsorb + absorbAmount)
2559 currentAbsorb = healing - absorbAmount;
2560
2561 absorbAmount += currentAbsorb;
2562
2563 // Reduce shield amount
2564 (*i)->SetAmount((*i)->GetAmount() - currentAbsorb);
2565 // Need remove it later
2566 if ((*i)->GetAmount() <= 0)
2567 existExpired = true;
2568 }
2569
2570 // Remove all expired absorb auras
2571 if (existExpired)
2572 {
2573 for (AuraEffectList::const_iterator i = vHealAbsorb.begin(); i != vHealAbsorb.end();)
2574 {
2575 AuraEffect* auraEff = *i;
2576 ++i;
2577 if (auraEff->GetAmount() <= 0)
2578 {
2579 uint32 removedAuras = healInfo.GetTarget()->m_removedAurasCount;
2581 if (healInfo.GetTarget()->m_removedAurasCount > removedAuras)
2582 i = vHealAbsorb.begin();
2583 }
2584 }
2585 }
2586
2587 if (absorbAmount > 0)
2588 healInfo.AbsorbHeal(absorbAmount);
2589}
@ SPELL_AURA_SCHOOL_HEAL_ABSORB
Definition SpellAuraDefines.h:364
SpellInfo const * GetSpellInfo() const
Definition Unit.h:416
void AbsorbHeal(uint32 amount)
Definition Unit.h:391
Unit * GetTarget() const
Definition Unit.h:412
uint32 GetHeal() const
Definition Unit.h:413
uint32 SchoolMask
Definition SpellInfo.h:392

References HealInfo::AbsorbHeal(), AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::GetAmount(), GetAuraEffectsByType(), AuraEffect::GetBase(), HealInfo::GetHeal(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), m_removedAurasCount, Aura::Remove(), SpellInfo::SchoolMask, and SPELL_AURA_SCHOOL_HEAL_ABSORB.

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), and HealBySpell().

◆ CalcSpellDuration()

int32 Unit::CalcSpellDuration ( SpellInfo const *  spellProto)
14947{
14948 uint8 comboPoints = GetComboPoints();
14949
14950 int32 minduration = spellProto->GetDuration();
14951 int32 maxduration = spellProto->GetMaxDuration();
14952
14953 int32 duration;
14954
14955 if (comboPoints && minduration != -1 && minduration != maxduration)
14956 duration = minduration + int32((maxduration - minduration) * comboPoints / 5);
14957 else
14958 duration = minduration;
14959
14960 return duration;
14961}
uint8 GetComboPoints(Unit const *who=nullptr) const
Definition Unit.h:953

References GetComboPoints(), SpellInfo::GetDuration(), and SpellInfo::GetMaxDuration().

Referenced by Aura::CalcMaxDuration(), Spell::EffectInterruptCast(), Spell::EffectSchoolDMG(), and Aura::HandleAuraSpecificMods().

◆ CalculateAOEDamageReduction()

int32 Unit::CalculateAOEDamageReduction ( int32  damage,
uint32  schoolMask,
bool  npcCaster 
) const
20232{
20233 damage = int32(float(damage) * GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, schoolMask));
20234 if (npcCaster)
20236
20237 return damage;
20238}
@ SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:373
@ SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE
Definition SpellAuraDefines.h:292
float GetTotalAuraMultiplierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6061

References GetTotalAuraMultiplierByMiscMask(), SPELL_AURA_MOD_AOE_DAMAGE_AVOIDANCE, and SPELL_AURA_MOD_CREATURE_AOE_DAMAGE_AVOIDANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget(), AuraEffect::HandlePeriodicDamageAurasTick(), and spell_dk_death_and_decay::RecalculateDamage().

◆ CalculateDamage()

uint32 Unit::CalculateDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
uint8  itemDamagesMask = 0 
)
3013{
3014 float minDamage = 0.0f;
3015 float maxDamage = 0.0f;
3016
3017 if (normalized || !addTotalPct || itemDamagesMask)
3018 {
3019 // get both by default
3020 if (!itemDamagesMask)
3021 {
3022 itemDamagesMask = (1 << 0) | (1 << 1);
3023 }
3024
3025 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
3026 {
3027 if (itemDamagesMask & (1 << i))
3028 {
3029 float minTmp, maxTmp;
3030 CalculateMinMaxDamage(attType, normalized, addTotalPct, minTmp, maxTmp, i);
3031 minDamage += minTmp;
3032 maxDamage += maxTmp;
3033 }
3034 }
3035 }
3036 else
3037 {
3038 switch (attType)
3039 {
3040 case RANGED_ATTACK:
3043 break;
3044 case BASE_ATTACK:
3047 break;
3048 case OFF_ATTACK:
3051 break;
3052 default:
3053 break;
3054 }
3055 }
3056
3057 minDamage = std::max(0.f, minDamage);
3058 maxDamage = std::max(0.f, maxDamage);
3059
3060 if (minDamage > maxDamage)
3061 {
3062 std::swap(minDamage, maxDamage);
3063 }
3064
3065 return urand(uint32(minDamage), uint32(maxDamage));
3066}
uint32 urand(uint32 min, uint32 max)
Definition Random.cpp:44
@ UNIT_FIELD_MINDAMAGE
Definition UpdateFields.h:127
@ UNIT_FIELD_MAXDAMAGE
Definition UpdateFields.h:128
@ UNIT_FIELD_MAXOFFHANDDAMAGE
Definition UpdateFields.h:130
@ UNIT_FIELD_MAXRANGEDDAMAGE
Definition UpdateFields.h:169
@ UNIT_FIELD_MINRANGEDDAMAGE
Definition UpdateFields.h:168
@ UNIT_FIELD_MINOFFHANDDAMAGE
Definition UpdateFields.h:129
virtual void CalculateMinMaxDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, float &minDamage, float &maxDamage, uint8 damageIndex=0)=0

References BASE_ATTACK, CalculateMinMaxDamage(), Object::GetFloatValue(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, UNIT_FIELD_MINRANGEDDAMAGE, and urand().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ CalculateDefaultCoefficient()

float Unit::CalculateDefaultCoefficient ( SpellInfo const *  spellInfo,
DamageEffectType  damagetype 
) const
17269{
17270 // Damage over Time spells bonus calculation
17271 float DotFactor = 1.0f;
17272 if (damagetype == DOT)
17273 {
17274 int32 DotDuration = spellInfo->GetDuration();
17275 if (!spellInfo->IsChanneled() && DotDuration > 0)
17276 DotFactor = DotDuration / 15000.0f;
17277
17278 if (uint32 DotTicks = spellInfo->GetMaxTicks())
17279 DotFactor /= DotTicks;
17280 }
17281
17282 int32 CastingTime = spellInfo->IsChanneled() ? spellInfo->GetDuration() : spellInfo->CalcCastTime();
17283 // Distribute Damage over multiple effects, reduce by AoE
17284 CastingTime = GetCastingTimeForBonus(spellInfo, damagetype, CastingTime);
17285
17286 // As wowwiki says: C = (Cast Time / 3.5)
17287 return (CastingTime / 3500.0f) * DotFactor;
17288}
@ DOT
Definition Unit.h:251
uint32 GetCastingTimeForBonus(SpellInfo const *spellProto, DamageEffectType damagetype, uint32 CastingTime) const
Definition Unit.cpp:17150

References SpellInfo::CalcCastTime(), DOT, GetCastingTimeForBonus(), SpellInfo::GetDuration(), SpellInfo::GetMaxTicks(), and SpellInfo::IsChanneled().

Referenced by SpellDamageBonusTaken(), and SpellHealingBonusTaken().

◆ CalculateLevelPenalty()

float Unit::CalculateLevelPenalty ( SpellInfo const *  spellProto) const
3069{
3070 if (!IsPlayer())
3071 return 1.0f;
3072
3073 if (spellProto->SpellLevel <= 0 || spellProto->SpellLevel >= spellProto->MaxLevel)
3074 return 1.0f;
3075
3076 float LvlPenalty = 0.0f;
3077
3078 // xinef: added brackets
3079 if (spellProto->SpellLevel < 20)
3080 LvlPenalty = (20.0f - spellProto->SpellLevel) * 3.75f;
3081
3082 float LvlFactor = (float(spellProto->SpellLevel) + 6.0f) / float(GetLevel());
3083 if (LvlFactor > 1.0f)
3084 LvlFactor = 1.0f;
3085
3086 return AddPct(LvlFactor, -LvlPenalty);
3087}
uint8 GetLevel() const
Definition Unit.h:1026

References AddPct(), GetLevel(), Object::IsPlayer(), SpellInfo::MaxLevel, and SpellInfo::SpellLevel.

Referenced by spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), CalculateSpellAmount(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), and SpellHealingBonusTaken().

◆ CalculateMeleeDamage()

void Unit::CalculateMeleeDamage ( Unit victim,
CalcDamageInfo damageInfo,
WeaponAttackType  attackType = BASE_ATTACK,
const bool  sittingVictim = false 
)
1491{
1492 damageInfo->attacker = this;
1493 damageInfo->target = victim;
1494
1495 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1496 {
1497 damageInfo->damages[i].damageSchoolMask = GetMeleeDamageSchoolMask(attackType, i);
1498 damageInfo->damages[i].damage = 0;
1499 damageInfo->damages[i].absorb = 0;
1500 damageInfo->damages[i].resist = 0;
1501 }
1502
1503 damageInfo->attackType = attackType;
1504 damageInfo->cleanDamage = 0;
1505 damageInfo->blocked_amount = 0;
1506
1507 damageInfo->TargetState = 0;
1508 damageInfo->HitInfo = 0;
1509 damageInfo->procAttacker = PROC_FLAG_NONE;
1510 damageInfo->procVictim = PROC_FLAG_NONE;
1511 damageInfo->procEx = PROC_EX_NONE;
1512 damageInfo->hitOutCome = MELEE_HIT_EVADE;
1513
1514 if (!victim)
1515 return;
1516
1517 if (!IsAlive() || !victim->IsAlive())
1518 return;
1519
1520 // Select HitInfo/procAttacker/procVictim flag based on attack type
1521 switch (attackType)
1522 {
1523 case BASE_ATTACK:
1526 break;
1527 case OFF_ATTACK:
1530 damageInfo->HitInfo = HITINFO_OFFHAND;
1531 break;
1532 default:
1533 return;
1534 }
1535
1536 // School Immune check
1537 uint8 immunedMask = 0;
1538 bool hasNonPhysicalSchoolMask = false;
1539 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1540 {
1542 {
1543 immunedMask |= (1 << i);
1545 {
1546 hasNonPhysicalSchoolMask = true;
1547 }
1548 }
1549 }
1550
1551 // School Immune check
1552 if (immunedMask & ((1 << 0) | (1 << 1)))
1553 {
1554 if (hasNonPhysicalSchoolMask || immunedMask == ((1 << 0) | (1 << 1)))
1555 {
1556 damageInfo->HitInfo |= HITINFO_NORMALSWING;
1557 damageInfo->TargetState = VICTIMSTATE_IS_IMMUNE;
1558
1559 damageInfo->procEx |= PROC_EX_IMMUNE;
1560 return;
1561 }
1562 }
1563
1564 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1565 {
1566 // only players have secondary weapon damage
1567 if (i > 0 && !IsPlayer())
1568 {
1569 break;
1570 }
1571
1572 if (immunedMask & (1 << i))
1573 {
1574 continue;
1575 }
1576
1577 SpellSchoolMask schoolMask = SpellSchoolMask(damageInfo->damages[i].damageSchoolMask);
1578 bool const addPctMods = (schoolMask & SPELL_SCHOOL_MASK_NORMAL);
1579
1580 uint32 damage = 0;
1581 uint8 itemDamagesMask = (IsPlayer()) ? (1 << i) : 0;
1582
1583 damage += CalculateDamage(damageInfo->attackType, false, addPctMods, itemDamagesMask);
1584 // Add melee damage bonus
1585 damage = MeleeDamageBonusDone(damageInfo->target, damage, damageInfo->attackType, nullptr, schoolMask);
1586 damage = damageInfo->target->MeleeDamageBonusTaken(this, damage, damageInfo->attackType, nullptr, schoolMask);
1587
1588 // Script Hook For CalculateMeleeDamage -- Allow scripts to change the Damage pre class mitigation calculations
1589 sScriptMgr->ModifyMeleeDamage(damageInfo->target, damageInfo->attacker, damage);
1590
1591 if (victim->GetAI())
1592 {
1593 victim->GetAI()->OnCalculateMeleeDamageReceived(damage, this);
1594 }
1595
1596 // Calculate armor reduction
1598 {
1599 damageInfo->damages[i].damage = Unit::CalcArmorReducedDamage(this, damageInfo->target, damage, nullptr, 0, damageInfo->attackType);
1600 damageInfo->cleanDamage += damage - damageInfo->damages[i].damage;
1601 }
1602 else
1603 {
1604 damageInfo->damages[i].damage = damage;
1605 }
1606 }
1607
1608 damageInfo->hitOutCome = RollMeleeOutcomeAgainst(damageInfo->target, damageInfo->attackType);
1609
1610 // If the victim was a sitting player and we didn't roll a miss, then crit.
1611 if (sittingVictim && damageInfo->hitOutCome != MELEE_HIT_MISS)
1612 {
1613 damageInfo->hitOutCome = MELEE_HIT_CRIT;
1614 }
1615 switch (damageInfo->hitOutCome)
1616 {
1617 case MELEE_HIT_EVADE:
1619 damageInfo->TargetState = VICTIMSTATE_EVADES;
1620 damageInfo->procEx |= PROC_EX_EVADE;
1621
1622 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1623 {
1624 damageInfo->damages[i].damage = 0;
1625 }
1626
1627 damageInfo->cleanDamage = 0;
1628 return;
1629 case MELEE_HIT_MISS:
1630 damageInfo->HitInfo |= HITINFO_MISS;
1631 damageInfo->TargetState = VICTIMSTATE_INTACT;
1632 damageInfo->procEx |= PROC_EX_MISS;
1633
1634 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1635 {
1636 damageInfo->damages[i].damage = 0;
1637 }
1638 damageInfo->cleanDamage = 0;
1639 break;
1640 case MELEE_HIT_NORMAL:
1641 damageInfo->TargetState = VICTIMSTATE_HIT;
1642 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1643 break;
1644 case MELEE_HIT_CRIT:
1645 {
1646 damageInfo->HitInfo |= HITINFO_CRITICALHIT;
1647 damageInfo->TargetState = VICTIMSTATE_HIT;
1648
1649 damageInfo->procEx |= PROC_EX_CRITICAL_HIT;
1650 // Crit bonus calc
1651 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1652 {
1653 damageInfo->damages[i].damage *= 2;
1654
1655 float mod = 0.0f;
1656 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1657 if (damageInfo->attackType == RANGED_ATTACK)
1658 {
1660 }
1661 else
1662 {
1664
1665 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1667 }
1668
1669 uint32 crTypeMask = damageInfo->target->GetCreatureTypeMask();
1670
1671 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1673 if (mod != 0)
1674 {
1675 AddPct(damageInfo->damages[i].damage, mod);
1676 }
1677 }
1678 break;
1679 }
1680 case MELEE_HIT_PARRY:
1681 damageInfo->TargetState = VICTIMSTATE_PARRY;
1682 damageInfo->procEx |= PROC_EX_PARRY;
1683 damageInfo->cleanDamage = 0;
1684
1685 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1686 {
1687 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1688 damageInfo->damages[i].damage = 0;
1689 }
1690 break;
1691 case MELEE_HIT_DODGE:
1692 damageInfo->TargetState = VICTIMSTATE_DODGE;
1693 damageInfo->procEx |= PROC_EX_DODGE;
1694 damageInfo->cleanDamage = 0;
1695
1696 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1697 {
1698 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1699 damageInfo->damages[i].damage = 0;
1700 }
1701 break;
1702 case MELEE_HIT_BLOCK:
1703 {
1704 damageInfo->TargetState = VICTIMSTATE_HIT;
1705 damageInfo->HitInfo |= HITINFO_BLOCK;
1706 damageInfo->procEx |= PROC_EX_BLOCK;
1707 damageInfo->blocked_amount = damageInfo->target->GetShieldBlockValue();
1708 // double blocked amount if block is critical
1709 if (damageInfo->target->isBlockCritical())
1710 damageInfo->blocked_amount += damageInfo->blocked_amount;
1711
1712 uint32 remainingBlock = damageInfo->blocked_amount;
1713 uint8 fullBlockMask = 0;
1714 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1715 {
1716 if (remainingBlock && remainingBlock >= damageInfo->damages[i].damage)
1717 {
1718 fullBlockMask |= (1 << i);
1719
1720 remainingBlock -= damageInfo->damages[i].damage;
1721 damageInfo->cleanDamage += damageInfo->damages[i].damage;
1722 damageInfo->damages[i].damage = 0;
1723 }
1724 else
1725 {
1726 damageInfo->cleanDamage += remainingBlock;
1727 damageInfo->damages[i].damage -= remainingBlock;
1728 remainingBlock = 0;
1729 }
1730 }
1731
1732 // full block
1733 if (fullBlockMask == ((1 << 0) | (1 << 1)))
1734 {
1735 damageInfo->TargetState = VICTIMSTATE_BLOCKS;
1736 damageInfo->procEx |= PROC_EX_FULL_BLOCK;
1737 damageInfo->blocked_amount -= remainingBlock;
1738 }
1739 break;
1740 }
1741 case MELEE_HIT_GLANCING:
1742 {
1743 damageInfo->HitInfo |= HITINFO_GLANCING;
1744 damageInfo->TargetState = VICTIMSTATE_HIT;
1745 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1746 int32 leveldif = int32(victim->GetLevel()) - int32(GetLevel());
1747 if (leveldif > 3)
1748 leveldif = 3;
1749 float reducePercent = 1 - leveldif * 0.1f;
1750
1751 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1752 {
1753 uint32 reducedDamage = uint32(reducePercent * damageInfo->damages[i].damage);
1754 damageInfo->cleanDamage += damageInfo->damages[i].damage - reducedDamage;
1755 damageInfo->damages[i].damage = reducedDamage;
1756 }
1757 break;
1758 }
1759 case MELEE_HIT_CRUSHING:
1760 damageInfo->HitInfo |= HITINFO_CRUSHING;
1761 damageInfo->TargetState = VICTIMSTATE_HIT;
1762 damageInfo->procEx |= PROC_EX_NORMAL_HIT;
1763
1764 // 150% normal damage
1765 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1766 {
1767 damageInfo->damages[i].damage += (damageInfo->damages[i].damage / 2);
1768 }
1769 break;
1770 default:
1771 break;
1772 }
1773
1774 // Always apply HITINFO_AFFECTS_VICTIM in case its not a miss
1775 if (!(damageInfo->HitInfo & HITINFO_MISS))
1776 damageInfo->HitInfo |= HITINFO_AFFECTS_VICTIM;
1777
1778 uint32 tmpHitInfo[MAX_ITEM_PROTO_DAMAGES] = { };
1779
1780 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1781 {
1782 int32 dmg = damageInfo->damages[i].damage;
1783 int32 cleanDamage = damageInfo->cleanDamage;
1784 // attackType is checked already for BASE_ATTACK or OFF_ATTACK so it can't be RANGED_ATTACK here
1785 if (CanApplyResilience())
1786 {
1787 int32 resilienceReduction = damageInfo->damages[i].damage;
1788 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, (damageInfo->hitOutCome == MELEE_HIT_CRIT), CR_CRIT_TAKEN_MELEE);
1789
1790 resilienceReduction = damageInfo->damages[i].damage - resilienceReduction;
1791 dmg -= resilienceReduction;
1792 cleanDamage += resilienceReduction;
1793 }
1794
1795 damageInfo->damages[i].damage = std::max(0, dmg);
1796 damageInfo->cleanDamage = std::max(0, cleanDamage);
1797
1798 // Calculate absorb resist
1799 if (damageInfo->damages[i].damage > 0)
1800 {
1801 damageInfo->procVictim |= PROC_FLAG_TAKEN_DAMAGE;
1802
1803 // Calculate absorb & resists
1804 DamageInfo dmgInfo(*damageInfo, i);
1805 Unit::CalcAbsorbResist(dmgInfo);
1806 damageInfo->damages[i].absorb = dmgInfo.GetAbsorb();
1807 damageInfo->damages[i].resist = dmgInfo.GetResist();
1808
1809 if (damageInfo->damages[i].absorb)
1810 {
1811 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].absorb == 0 ? HITINFO_FULL_ABSORB : HITINFO_PARTIAL_ABSORB);
1812 }
1813
1814 if (damageInfo->damages[i].resist)
1815 {
1816 tmpHitInfo[i] |= (damageInfo->damages[i].damage - damageInfo->damages[i].resist == 0 ? HITINFO_FULL_RESIST : HITINFO_PARTIAL_RESIST);
1817 }
1818
1819 damageInfo->damages[i].damage = dmgInfo.GetDamage();
1820 }
1821 }
1822
1823 // set proper HitInfo flags
1824 if ((tmpHitInfo[0] & HITINFO_FULL_ABSORB) != 0)
1825 {
1826 // set partial absorb when secondary damage isn't full absorbed
1827 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_ABSORB) != 0) ? HITINFO_PARTIAL_ABSORB : HITINFO_FULL_ABSORB;
1828 }
1829 else
1830 {
1831 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_ABSORB);
1832 }
1833
1834 if ((tmpHitInfo[0] & HITINFO_FULL_RESIST) != 0)
1835 {
1836 // set partial resist when secondary damage isn't full resisted
1837 damageInfo->HitInfo |= ((tmpHitInfo[1] & HITINFO_PARTIAL_RESIST) != 0) ? HITINFO_PARTIAL_RESIST : HITINFO_FULL_RESIST;
1838 }
1839 else
1840 {
1841 damageInfo->HitInfo |= (tmpHitInfo[0] & HITINFO_PARTIAL_RESIST);
1842 }
1843
1845 {
1846 damageInfo->procEx |= PROC_EX_ABSORB;
1847 }
1848
1849 if (damageInfo->HitInfo & HITINFO_FULL_RESIST)
1850 {
1851 damageInfo->procEx |= PROC_EX_RESIST;
1852 }
1853}
@ SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
Definition SpellAuraDefines.h:232
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE
Definition SpellAuraDefines.h:267
@ SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
Definition SpellAuraDefines.h:226
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
Definition SpellAuraDefines.h:266
@ PROC_EX_NONE
Definition SpellMgr.h:193
@ PROC_EX_DODGE
Definition SpellMgr.h:198
@ PROC_EX_BLOCK
Definition SpellMgr.h:200
@ PROC_EX_CRITICAL_HIT
Definition SpellMgr.h:195
@ PROC_EX_MISS
Definition SpellMgr.h:196
@ PROC_EX_RESIST
Definition SpellMgr.h:197
@ PROC_EX_FULL_BLOCK
Definition SpellMgr.h:207
@ PROC_EX_ABSORB
Definition SpellMgr.h:204
@ PROC_EX_PARRY
Definition SpellMgr.h:199
@ PROC_EX_EVADE
Definition SpellMgr.h:201
@ PROC_FLAG_DONE_MELEE_AUTO_ATTACK
Definition SpellMgr.h:110
@ PROC_FLAG_DONE_MAINHAND_ATTACK
Definition SpellMgr.h:140
@ PROC_FLAG_TAKEN_DAMAGE
Definition SpellMgr.h:137
@ PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK
Definition SpellMgr.h:111
@ PROC_FLAG_DONE_OFFHAND_ATTACK
Definition SpellMgr.h:141
@ PROC_FLAG_NONE
Definition SpellMgr.h:105
@ VICTIMSTATE_INTACT
Definition Unit.h:84
@ VICTIMSTATE_HIT
Definition Unit.h:85
@ VICTIMSTATE_DODGE
Definition Unit.h:86
@ VICTIMSTATE_IS_IMMUNE
Definition Unit.h:91
@ VICTIMSTATE_PARRY
Definition Unit.h:87
@ VICTIMSTATE_BLOCKS
Definition Unit.h:89
@ VICTIMSTATE_EVADES
Definition Unit.h:90
@ HITINFO_PARTIAL_ABSORB
Definition Unit.h:104
@ HITINFO_FULL_RESIST
Definition Unit.h:105
@ HITINFO_NORMALSWING
Definition Unit.h:97
@ HITINFO_BLOCK
Definition Unit.h:111
@ HITINFO_CRUSHING
Definition Unit.h:115
@ HITINFO_SWINGNOHITSOUND
Definition Unit.h:119
@ HITINFO_MISS
Definition Unit.h:102
@ HITINFO_FULL_ABSORB
Definition Unit.h:103
@ HITINFO_OFFHAND
Definition Unit.h:100
@ HITINFO_GLANCING
Definition Unit.h:114
@ HITINFO_CRITICALHIT
Definition Unit.h:107
@ HITINFO_PARTIAL_RESIST
Definition Unit.h:106
@ HITINFO_AFFECTS_VICTIM
Definition Unit.h:99
@ MELEE_HIT_CRUSHING
Definition Unit.h:287
@ MELEE_HIT_BLOCK
Definition Unit.h:286
@ MELEE_HIT_CRIT
Definition Unit.h:287
@ MELEE_HIT_EVADE
Definition Unit.h:286
@ MELEE_HIT_DODGE
Definition Unit.h:286
@ MELEE_HIT_MISS
Definition Unit.h:286
@ MELEE_HIT_PARRY
Definition Unit.h:286
@ MELEE_HIT_GLANCING
Definition Unit.h:287
virtual void OnCalculateMeleeDamageReceived(uint32 &, Unit *)
Called during damage calculations.
Definition UnitAI.h:380
bool isBlockCritical()
Definition Unit.cpp:3154
uint32 MeleeDamageBonusTaken(Unit *attacker, uint32 pdamage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13359
virtual SpellSchoolMask GetMeleeDamageSchoolMask(WeaponAttackType attackType=BASE_ATTACK, uint8 damageIndex=0) const =0
int32 GetTotalAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6048
bool CanApplyResilience() const
Definition Unit.h:1095
uint32 CalculateDamage(WeaponAttackType attType, bool normalized, bool addTotalPct, uint8 itemDamagesMask=0)
Definition Unit.cpp:3012
virtual uint32 GetShieldBlockValue() const =0
static void ApplyResilience(Unit const *victim, float *crit, int32 *damage, bool isCrit, CombatRating type)
Definition Unit.cpp:19013
UnitAI * GetAI()
Definition Unit.h:648
static bool IsDamageReducedByArmor(SpellSchoolMask damageSchoolMask, SpellInfo const *spellInfo=nullptr, uint8 effIndex=MAX_SPELL_EFFECTS)
Definition Unit.cpp:2034
int32 GetTotalAuraModifier(AuraType auratype) const
Definition Unit.cpp:5997
MeleeHitOutcome RollMeleeOutcomeAgainst(Unit const *victim, WeaponAttackType attType) const
Definition Unit.cpp:2811
uint32 GetCreatureTypeMask() const
Definition Unit.h:778
uint32 MeleeDamageBonusDone(Unit *pVictim, uint32 damage, WeaponAttackType attType, SpellInfo const *spellProto=nullptr, SpellSchoolMask damageSchoolMask=SPELL_SCHOOL_MASK_NORMAL)
Definition Unit.cpp:13157
uint32 damageSchoolMask
Definition Unit.h:470
uint32 blocked_amount
Definition Unit.h:476
MeleeHitOutcome hitOutCome
Definition Unit.h:485
uint32 cleanDamage
Definition Unit.h:484
uint32 TargetState
Definition Unit.h:478
uint32 resist
Definition Unit.h:473

References CalcDamageInfo::absorb, AddPct(), ApplyResilience(), CalcDamageInfo::attacker, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), CalcArmorReducedDamage(), CalculateDamage(), CanApplyResilience(), CalcDamageInfo::cleanDamage, CR_CRIT_TAKEN_MELEE, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), GetLevel(), GetMeleeDamageSchoolMask(), DamageInfo::GetResist(), GetShieldBlockValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), GetTotalAuraMultiplierByMiscMask(), CalcDamageInfo::HitInfo, HITINFO_AFFECTS_VICTIM, HITINFO_BLOCK, HITINFO_CRITICALHIT, HITINFO_CRUSHING, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_GLANCING, HITINFO_MISS, HITINFO_NORMALSWING, HITINFO_OFFHAND, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_SWINGNOHITSOUND, CalcDamageInfo::hitOutCome, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, MeleeDamageBonusDone(), MeleeDamageBonusTaken(), OFF_ATTACK, UnitAI::OnCalculateMeleeDamageReceived(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_EVADE, PROC_EX_FULL_BLOCK, PROC_EX_IMMUNE, PROC_EX_MISS, PROC_EX_NONE, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_MELEE_AUTO_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_NONE, PROC_FLAG_TAKEN_DAMAGE, PROC_FLAG_TAKEN_MELEE_AUTO_ATTACK, CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, RANGED_ATTACK, CalcDamageInfo::resist, RollMeleeOutcomeAgainst(), SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_SCHOOL_MASK_NORMAL, sScriptMgr, CalcDamageInfo::target, CalcDamageInfo::TargetState, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, VICTIMSTATE_EVADES, VICTIMSTATE_HIT, VICTIMSTATE_INTACT, VICTIMSTATE_IS_IMMUNE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ CalculateMinMaxDamage()

virtual void Unit::CalculateMinMaxDamage ( WeaponAttackType  attType,
bool  normalized,
bool  addTotalPct,
float &  minDamage,
float &  maxDamage,
uint8  damageIndex = 0 
)
pure virtual

Implemented in Creature, and Player.

Referenced by CalculateDamage(), and UpdateDamagePhysical().

◆ CalculateSpellDamage()

int32 Unit::CalculateSpellDamage ( Unit const *  target,
SpellInfo const *  spellProto,
uint8  effect_index,
int32 const *  basePoints = nullptr 
) const

◆ CalculateSpellDamageTaken()

void Unit::CalculateSpellDamageTaken ( SpellNonMeleeDamage damageInfo,
int32  damage,
SpellInfo const *  spellInfo,
WeaponAttackType  attackType = BASE_ATTACK,
bool  crit = false 
)
1322{
1323 if (damage < 0)
1324 return;
1325
1326 Unit* victim = damageInfo->target;
1327 if (!victim || !victim->IsAlive())
1328 return;
1329
1330 SpellSchoolMask damageSchoolMask = SpellSchoolMask(damageInfo->schoolMask);
1331 uint32 crTypeMask = victim->GetCreatureTypeMask();
1332
1333 // Script Hook For CalculateSpellDamageTaken -- Allow scripts to change the Damage post class mitigation calculations
1334 sScriptMgr->ModifySpellDamageTaken(damageInfo->target, damageInfo->attacker, damage, spellInfo);
1335
1336 if (victim->GetAI())
1337 {
1338 victim->GetAI()->OnCalculateSpellDamageReceived(damage, this);
1339 }
1340
1341 int32 cleanDamage = 0;
1342 if (Unit::IsDamageReducedByArmor(damageSchoolMask, spellInfo))
1343 {
1344 int32 oldDamage = damage;
1345 damage = Unit::CalcArmorReducedDamage(this, victim, damage, spellInfo, 0, attackType);
1346 cleanDamage = oldDamage - damage;
1347 }
1348
1349 bool blocked = false;
1350 // Per-school calc
1351 switch (spellInfo->DmgClass)
1352 {
1353 // Melee and Ranged Spells
1356 {
1357 // Physical Damage
1358 if (damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL)
1359 {
1360 // Get blocked status
1361 blocked = isSpellBlocked(victim, spellInfo, attackType);
1362 }
1363
1364 if (crit)
1365 {
1366 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1367
1368 // Calculate crit bonus
1369 uint32 crit_bonus = damage;
1370 // Apply crit_damage bonus for melee spells
1371 if (Player* modOwner = GetSpellModOwner())
1372 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
1373 damage += crit_bonus;
1374
1375 // Apply SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE or SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE
1376 float critPctDamageMod = 0.0f;
1377 if (attackType == RANGED_ATTACK)
1379 else
1381
1382 // Increase crit damage from SPELL_AURA_MOD_CRIT_DAMAGE_BONUS
1383 critPctDamageMod += GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellInfo->GetSchoolMask());
1384
1385 // Increase crit damage from SPELL_AURA_MOD_CRIT_PERCENT_VERSUS
1387
1388 if (critPctDamageMod != 0)
1389 AddPct(damage, critPctDamageMod);
1390 }
1391
1392 // Spell weapon based damage CAN BE crit & blocked at same time
1393 if (blocked)
1394 {
1395 damageInfo->blocked = victim->GetShieldBlockValue();
1396 // double blocked amount if block is critical
1397 if (victim->isBlockCritical())
1398 damageInfo->blocked *= 2;
1399 if (damage < int32(damageInfo->blocked))
1400 damageInfo->blocked = uint32(damage);
1401
1402 damage -= damageInfo->blocked;
1403 cleanDamage += damageInfo->blocked;
1404 }
1405
1406 int32 resilienceReduction = damage;
1407 if (CanApplyResilience())
1408 {
1409 if (attackType != RANGED_ATTACK)
1410 {
1411 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_MELEE);
1412 }
1413 else
1414 {
1415 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_RANGED);
1416 }
1417 }
1418
1419 resilienceReduction = damage - resilienceReduction;
1420 damage -= resilienceReduction;
1421 cleanDamage += resilienceReduction;
1422 break;
1423 }
1424 // Magical Attacks
1427 {
1428 // If crit add critical bonus
1429 if (crit)
1430 {
1431 damageInfo->HitInfo |= SPELL_HIT_TYPE_CRIT;
1432 damage = Unit::SpellCriticalDamageBonus(this, spellInfo, damage, victim);
1433 }
1434
1435 int32 resilienceReduction = damage;
1436 if (CanApplyResilience())
1437 {
1438 Unit::ApplyResilience(victim, nullptr, &resilienceReduction, crit, CR_CRIT_TAKEN_SPELL);
1439 }
1440
1441 resilienceReduction = damage - resilienceReduction;
1442 damage -= resilienceReduction;
1443 cleanDamage += resilienceReduction;
1444 break;
1445 }
1446 default:
1447 break;
1448 }
1449
1450 damageInfo->cleanDamage = std::max(0, cleanDamage);
1451 damageInfo->damage = std::max(0, damage);
1452
1453 // Calculate absorb resist
1454 if (damageInfo->damage > 0)
1455 {
1456 DamageInfo dmgInfo(*damageInfo, SPELL_DIRECT_DAMAGE);
1457 Unit::CalcAbsorbResist(dmgInfo);
1458 damageInfo->absorb = dmgInfo.GetAbsorb();
1459 damageInfo->resist = dmgInfo.GetResist();
1460 damageInfo->damage = dmgInfo.GetDamage();
1461 }
1462}
@ SPELL_DAMAGE_CLASS_RANGED
Definition SharedDefines.h:1548
@ SPELL_DAMAGE_CLASS_MAGIC
Definition SharedDefines.h:1546
@ SPELL_DAMAGE_CLASS_NONE
Definition SharedDefines.h:1545
@ SPELL_DAMAGE_CLASS_MELEE
Definition SharedDefines.h:1547
@ SPELL_HIT_TYPE_CRIT
Definition SharedDefines.h:1536
@ SPELLMOD_CRIT_DAMAGE_BONUS
Definition SpellDefines.h:91
@ SPELL_DIRECT_DAMAGE
Definition Unit.h:250
virtual void OnCalculateSpellDamageReceived(int32 &, Unit *)
Definition UnitAI.h:381
bool isSpellBlocked(Unit *victim, SpellInfo const *spellProto, WeaponAttackType attackType=BASE_ATTACK)
Definition Unit.cpp:3128
static uint32 SpellCriticalDamageBonus(Unit const *caster, SpellInfo const *spellProto, uint32 damage, Unit const *victim)
Definition Unit.cpp:12364
Unit * target
Definition Unit.h:496
uint32 HitInfo
Definition Unit.h:507
uint32 damage
Definition Unit.h:499
uint32 absorb
Definition Unit.h:502
Unit * attacker
Definition Unit.h:497
uint32 schoolMask
Definition Unit.h:501
uint32 cleanDamage
Definition Unit.h:509
uint32 resist
Definition Unit.h:503
uint32 blocked
Definition Unit.h:506

References SpellNonMeleeDamage::absorb, AddPct(), ApplyResilience(), SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CalcAbsorbResist(), CalcArmorReducedDamage(), CanApplyResilience(), SpellNonMeleeDamage::cleanDamage, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, SpellNonMeleeDamage::damage, SpellInfo::DmgClass, DamageInfo::GetAbsorb(), GetAI(), GetCreatureTypeMask(), DamageInfo::GetDamage(), DamageInfo::GetResist(), SpellInfo::GetSchoolMask(), GetShieldBlockValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, IsAlive(), isBlockCritical(), IsDamageReducedByArmor(), isSpellBlocked(), UnitAI::OnCalculateSpellDamageReceived(), RANGED_ATTACK, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_DAMAGE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_DAMAGE, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_DIRECT_DAMAGE, SPELL_HIT_TYPE_CRIT, SPELL_SCHOOL_MASK_NORMAL, SpellCriticalDamageBonus(), SPELLMOD_CRIT_DAMAGE_BONUS, sScriptMgr, and SpellNonMeleeDamage::target.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ CanApplyResilience()

bool Unit::CanApplyResilience ( ) const
inline

◆ CanDualWield()

◆ CanEnterWater()

virtual bool Unit::CanEnterWater ( ) const
pure virtual

Implemented in Creature, and Player.

◆ CanFly()

◆ CanFreeMove()

bool Unit::CanFreeMove ( ) const
inline
1637 {
1640 }
@ UNIT_STATE_DISTRACTED
Definition UnitDefines.h:182
@ UNIT_STATE_CONFUSED
Definition UnitDefines.h:181
@ UNIT_STATE_FLEEING
Definition UnitDefines.h:177
@ UNIT_STATE_IN_FLIGHT
Definition UnitDefines.h:178
@ UNIT_STATE_STUNNED
Definition UnitDefines.h:173

References GetOwnerGUID(), HasUnitState(), UNIT_STATE_CONFUSED, UNIT_STATE_DISTRACTED, UNIT_STATE_FLEEING, UNIT_STATE_IN_FLIGHT, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by Creature::IsFreeToMove().

◆ CanHaveThreatList()

bool Unit::CanHaveThreatList ( bool  skipAliveCheck = false) const
14705{
14706 // only creatures can have threat list
14707 if (!IsCreature())
14708 return false;
14709
14710 // only alive units can have threat list
14711 if (!skipAliveCheck && !IsAlive())
14712 return false;
14713
14714 // totems can not have threat list
14715 if (ToCreature()->IsTotem())
14716 return false;
14717
14718 // vehicles can not have threat list
14719 if (ToCreature()->IsVehicle() && GetMap()->IsBattlegroundOrArena())
14720 return false;
14721
14722 // summons can not have a threat list, unless they are controlled by a creature
14724 return false;
14725
14726 return true;
14727}
@ UNIT_MASK_CONTROLLABLE_GUARDIAN
Definition UnitDefines.h:164
@ UNIT_MASK_GUARDIAN
Definition UnitDefines.h:158
bool IsVehicle() const
Definition Unit.h:750
Map * GetMap() const
Definition Object.h:587

References WorldObject::GetMap(), GetOwnerGUID(), HasUnitTypeMask(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), IsTotem(), IsVehicle(), Object::ToCreature(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_MASK_GUARDIAN, and UNIT_MASK_MINION.

Referenced by AddThreat(), Creature::CanPeriodicallyCallForAssistance(), ThreatMgr::ClearAllThreat(), DealDamage(), ScriptedAI::DoResetThreatList(), CreatureAI::DoZoneInCombat(), Spell::EffectTaunt(), Spell::EffectThreat(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleModTaunt(), Spell::HandleThreatSpells(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), Creature::SelectVictim(), TauntApply(), TauntFadeOut(), and Update().

◆ CanInstantCast()

bool Unit::CanInstantCast ( ) const
inline
1506{ return _instantCast; }

References _instantCast.

Referenced by ModSpellCastTime().

◆ CanModifyStats()

◆ CanProc()

bool Unit::CanProc ( )
inline
1476{ return !m_procDeep; }

References m_procDeep.

Referenced by Spell::DoAllEffectOnTarget().

◆ CanRestoreMana()

bool Unit::CanRestoreMana ( SpellInfo const *  spellInfo) const
21090{
21091 // Aura of Despair exceptions
21092 switch (spellInfo->Id)
21093 {
21094 case 16666: // Demonic Rune
21095 case 27869: // Dark Rune
21096 case 30824: // Shamanistic Rage
21097 case 31786: // Spiritual Attunement
21098 case 31930: // Judgements of the Wise
21099 case 34075: // Aspect of the Viper
21100 case 34720: // Thrill of the hunt
21101 case 47755: // Rapture
21102 case 54425: // Improved Felhunter
21103 case 57319: // Blessing of Sanctuary
21104 case 63337: // Saronite Vapors (regenerate mana)
21105 case 63375: // Improved stormstrike
21106 case 64372: // Lifebloom
21107 case 68285: // Improved Leader of the Pack
21108 return true;
21109 case 54428: // Divine Plea - only with talent Guarded by the Light
21110 return HasSpell(53583);
21111 default:
21112 break;
21113 }
21114
21115 return false;
21116}
virtual bool HasSpell(uint32) const
Definition Unit.h:1501

References HasSpell(), and SpellInfo::Id.

Referenced by IsImmunedToSpellEffect().

◆ CanSparringWith()

bool Unit::CanSparringWith ( Unit const *  attacker) const
protected
3987{
3989 return false;
3990
3991 if (!attacker)
3992 return false;
3993
3994 if (!attacker->IsCreature() || attacker->IsCharmedOwnedByPlayerOrPlayer())
3995 return false;
3996
3997 if (Creature const* creature = ToCreature())
3998 if (!creature->GetSparringPct())
3999 return false;
4000
4001 return true;
4002}
bool IsCharmedOwnedByPlayerOrPlayer() const
Definition Unit.h:1236

References IsCharmedOwnedByPlayerOrPlayer(), Object::IsCreature(), and Object::ToCreature().

Referenced by AttackerStateUpdate(), and DealDamage().

◆ CanSwim()

bool Unit::CanSwim ( ) const
virtual

this method checks the current flag of a unit

These flags can be set within the database or dynamically changed at runtime UNIT_FLAG_SWIMMING must be updated when a unit enters a swimmable area

Reimplemented in Creature.

19785{
19786 // Mirror client behavior, if this method returns false then client will not use swimming animation and for players will apply gravity as if there was no water
19788 return false;
19790 return true;
19792 return false;
19794 return true;
19796}
@ UNIT_FLAG2_UNUSED_6
Definition UnitDefines.h:307
@ UNIT_FLAG_CANNOT_SWIM
Definition UnitDefines.h:264
@ UNIT_FLAG_POSSESSED
Definition UnitDefines.h:274
@ UNIT_FLAG_SWIMMING
Definition UnitDefines.h:265
@ UNIT_FLAG_RENAME
Definition UnitDefines.h:254
@ UNIT_FLAG_PET_IN_COMBAT
Definition UnitDefines.h:261
bool HasUnitFlag2(UnitFlags2 flags) const
Definition Unit.h:708

References HasUnitFlag(), HasUnitFlag2(), UNIT_FLAG2_UNUSED_6, UNIT_FLAG_CANNOT_SWIM, UNIT_FLAG_PET_IN_COMBAT, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_FLAG_POSSESSED, UNIT_FLAG_RENAME, and UNIT_FLAG_SWIMMING.

Referenced by PathGenerator::BuildPolyPath(), and Creature::CanSwim().

◆ CanUseAttackType()

◆ CastCustomSpell() [1/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
CustomSpellValues const &  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1277{
1278 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1279 if (!spellInfo)
1280 {
1281 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1283 }
1284
1285 SpellCastTargets targets;
1286 targets.SetUnitTarget(victim);
1287
1288 return CastSpell(targets, spellInfo, &value, triggerFlags, castItem, triggeredByAura, originalCaster);
1289}
#define LOG_ERROR(filterType__,...)
Definition Log.h:158
@ SPELL_FAILED_SPELL_UNAVAILABLE
Definition SharedDefines.h:1056
Definition Spell.h:111
void SetUnitTarget(Unit *target)
Definition Spell.cpp:239

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetUnitTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastCustomSpell() [2/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1263{
1264 CustomSpellValues values;
1265 values.AddSpellMod(mod, value);
1266 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1267}
@ TRIGGERED_NONE
Definition SpellDefines.h:133
Definition SpellDefines.h:165
void AddSpellMod(SpellValueMod mod, int32 value)
Definition SpellDefines.h:167
SpellCastResult CastCustomSpell(Unit *victim, uint32 spellId, int32 const *bp0, int32 const *bp1, int32 const *bp2, bool triggered, Item *castItem=nullptr, AuraEffect const *triggeredByAura=nullptr, ObjectGuid originalCaster=ObjectGuid::Empty)
Definition Unit.cpp:1250

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastCustomSpell() [3/4]

SpellCastResult Unit::CastCustomSpell ( uint32  spellId,
SpellValueMod  mod,
int32  value,
Unit victim = nullptr,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1270{
1271 CustomSpellValues values;
1272 values.AddSpellMod(mod, value);
1273 return CastCustomSpell(spellId, values, target, triggerFlags, castItem, triggeredByAura, originalCaster);
1274}

References CustomSpellValues::AddSpellMod(), and CastCustomSpell().

◆ CastCustomSpell() [4/4]

SpellCastResult Unit::CastCustomSpell ( Unit victim,
uint32  spellId,
int32 const *  bp0,
int32 const *  bp1,
int32 const *  bp2,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1251{
1252 CustomSpellValues values;
1253 if (bp0)
1254 values.AddSpellMod(SPELLVALUE_BASE_POINT0, *bp0);
1255 if (bp1)
1256 values.AddSpellMod(SPELLVALUE_BASE_POINT1, *bp1);
1257 if (bp2)
1258 values.AddSpellMod(SPELLVALUE_BASE_POINT2, *bp2);
1259 return CastCustomSpell(spellId, values, target, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1260}
@ SPELLVALUE_BASE_POINT1
Definition SpellDefines.h:114
@ SPELLVALUE_BASE_POINT2
Definition SpellDefines.h:115
@ SPELLVALUE_BASE_POINT0
Definition SpellDefines.h:113

References CustomSpellValues::AddSpellMod(), CastCustomSpell(), SPELLVALUE_BASE_POINT0, SPELLVALUE_BASE_POINT1, SPELLVALUE_BASE_POINT2, TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

Referenced by spell_pri_guardian_spirit::Absorb(), spell_mage_fire_frost_ward::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_the_lich_king_necrotic_plague_jump_aura::AfterDispel(), spell_dru_lifebloom::AfterRemove(), Player::ApplyEnchantment(), CastCustomSpell(), CastCustomSpell(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), npc_gas_cloud::npc_gas_cloudAI::CastMainSpell(), CastPetAura(), spell_ruby_sanctum_rallying_shout::CountAllies(), spell_igb_rocket_artillery_explosion::DamageGunship(), boss_illidari_council_memberAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), Spell::EffectDestroyAllTotems(), Spell::EffectDispel(), Spell::EffectFeedPet(), Spell::EffectForceCast(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonType(), EnterVehicle(), EnterVehicleUnattackable(), AuraMunchingQueue::Execute(), TriggerWickedSpirit::Execute(), spell_sha_totem_of_wrath::HandleAfterCast(), spell_reflective_shield_aura::HandleAfterEffectAbsorb(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_pri_shadow_word_death::HandleDamage(), spell_dk_corpse_explosion::HandleDamage(), spell_dru_lifebloom::HandleDispel(), spell_igb_burning_pitch::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_deathbringer_blood_link::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_gen_dummy_trigger::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_pal_divine_storm_dummy::HandleDummy(), spell_sha_ancestral_awakening_proc::HandleDummy(), spell_sha_cleansing_totem_pulse::HandleDummy(), spell_warl_life_tap::HandleDummy(), spell_warr_last_stand::HandleDummy(), spell_warr_charge::HandleDummy(), spell_warr_slam::HandleDummy(), spell_warr_bloodthirst::HandleDummy(), HandleDummyAuraProc(), spell_egg_explosion::HandleDummyHitTarget(), spell_warr_execute::HandleEffect(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_serpentshrine_cavern_infection::HandleEffectRemove(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_ragin_flames_inferno::HandlePeriodic(), spell_dk_death_and_decay_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_deathbringer_blood_link_aura::HandleProc(), spell_deathbringer_blood_link_blood_beast_aura::HandleProc(), spell_reliquary_of_souls_aura_of_desire_aura::HandleProc(), spell_black_temple_consuming_strikes_aura::HandleProc(), spell_item_blade_ward_enchant::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), spell_dru_living_seed_proc::HandleProc(), spell_hun_ascpect_of_the_viper::HandleProc(), spell_sha_earth_shield::HandleProc(), spell_the_lich_king_dark_hunger_aura::HandleProc(), spell_yogg_saron_grim_reprisal_aura::HandleProc(), spell_dk_wandering_plague_aura::HandleProc(), spell_dk_blood_gorged::HandleProc(), spell_dru_living_seed::HandleProc(), spell_gen_blade_warding::HandleProc(), spell_hun_glyph_of_arcane_shot::HandleProc(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_item_necrotic_touch::HandleProc(), spell_mage_burnout::HandleProc(), spell_pal_seal_of_command_aura::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pal_seal_of_righteousness::HandleProc(), spell_pri_divine_aegis::HandleProc(), spell_pri_glyph_of_prayer_of_healing::HandleProc(), spell_rog_blade_flurry::HandleProc(), spell_sha_item_mana_surge::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellWithValueAuraProc(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_igb_rocket_pack_aura::HandleRemove(), spell_warl_haunt_aura::HandleRemove(), spell_pal_lay_on_hands::HandleScript(), spell_kelthuzad_detonate_mana_aura::HandleScript(), spell_gluth_decimate::HandleScriptEffect(), spell_hun_chimera_shot::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), spell_illidari_council_circle_of_healing::HandleSharedRule(), HandleSpellClick(), spell_halion_damage_aoe_summon::HandleSummon(), spell_putricide_mutated_transformation::HandleSummon(), spell_putricide_mutated_plague_aura::HandleTriggerSpell(), boss_sathrovarr::JustEngagedWith(), boss_essence_of_suffering::boss_essence_of_sufferingAI::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_felblood_kaelthas::JustEngagedWith(), boss_kalecgos::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_najentus::JustEngagedWith(), boss_morogrim_tidewalker::JustEngagedWith(), boss_felmyst::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_janalai_hatcher::MovementInform(), npc_frost_tomb::npc_frost_tomb(), spell_dru_tiger_s_fury::OnHit(), spell_gen_flurry_of_claws::OnPeriodic(), spell_blood_queen_essence_of_the_blood_queen_aura::OnProc(), spell_pal_eye_for_an_eye::OnProc(), spell_warl_siphon_life::OnProc(), spell_warl_fel_synergy::OnProc(), spell_warr_improved_spell_reflection::OnProc(), spell_warr_damage_shield::OnProc(), spell_kalecgos_curse_of_boundless_agony_aura::OnRemove(), spell_halion_marks_aura::OnRemove(), spell_putricide_mutated_plague_aura::OnRemove(), spell_the_lich_king_necrotic_plague_aura::OnRemove(), spell_yogg_saron_malady_of_the_mind_aura::OnRemove(), spell_sindragosa_instability_aura::OnRemove(), spell_the_lich_king_necrotic_plague_jump_aura::OnRemove(), spell_karazhan_overload_aura::PeriodicTick(), spell_entropius_negative_energy_periodic::PeriodicTick(), spell_doomfire::PeriodicTick(), spell_blood_queen_pact_of_the_darkfallen_dmg_aura::PeriodicTick(), spell_broggok_poison_cloud::PeriodicTick(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11198_take_down_tethyr::PrepareSpellScript(), SmartScript::ProcessAction(), spell_illidari_council_reflective_shield_aura::ReflectDamage(), spell_pri_power_word_shield_aura::ReflectDamage(), boss_kiljaeden::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), boss_kiljaeden::ScheduleBasicAbilities(), boss_magtheridon::ScheduleCombatEvents(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), boss_viscidus::SummonedCreatureDies(), spell_dk_anti_magic_shell_self::Trigger(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), spell_the_lich_king_life_siphon::TriggerHeal(), spell_pal_divine_storm::TriggerHeal(), spell_black_temple_shadow_inferno_aura::Update(), spell_black_temple_spell_absorption_aura::Update(), npc_coren_direbrew::UpdateAI(), boss_huhuran::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_living_constellation::npc_living_constellationAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), and boss_toravon::boss_toravonAI::UpdateAI().

◆ CastDelayedSpellWithPeriodicAmount()

void Unit::CastDelayedSpellWithPeriodicAmount ( Unit caster,
uint32  spellId,
AuraType  auraType,
int32  addAmount,
uint8  effectIndex = 0 
)
20144{
20145 AuraEffect* aurEff = nullptr;
20146 for (AuraEffectList::iterator i = m_modAuras[auraType].begin(); i != m_modAuras[auraType].end(); ++i)
20147 {
20148 aurEff = *i;
20149 if (aurEff->GetCasterGUID() != caster->GetGUID() || aurEff->GetId() != spellId || aurEff->GetEffIndex() != effectIndex || !aurEff->GetTotalTicks())
20150 continue;
20151
20152 addAmount += ((aurEff->GetOldAmount() * std::max<int32>(aurEff->GetTotalTicks() - int32(aurEff->GetTickNumber()), 0)) / aurEff->GetTotalTicks());
20153 break;
20154 }
20155
20156 // xinef: delay only for casting on different unit
20157 if (this == caster || !sWorld->getBoolConfig(CONFIG_MUNCHING_BLIZZLIKE))
20158 caster->CastCustomSpell(spellId, SPELLVALUE_BASE_POINT0, addAmount, this, TriggerCastFlags(TRIGGERED_FULL_MASK & ~TRIGGERED_NO_PERIODIC_RESET), nullptr, aurEff, caster->GetGUID());
20159 else
20160 caster->m_Events.AddEvent(new AuraMunchingQueue(*caster, GetGUID(), addAmount, spellId, aurEff, auraType), caster->m_Events.CalculateQueueTime(400));
20161}
TriggerCastFlags
Definition SpellDefines.h:132
@ TRIGGERED_NO_PERIODIC_RESET
Will ignore equipped item requirements.
Definition SpellDefines.h:152
@ CONFIG_MUNCHING_BLIZZLIKE
Definition WorldConfig.h:141
uint32 GetTickNumber() const
Definition SpellAuraEffects.h:87
int32 GetOldAmount() const
Definition SpellAuraEffects.h:117
uint32 GetId() const
Definition SpellAuraEffects.cpp:433
int32 GetTotalTicks() const
Definition SpellAuraEffects.cpp:7383
ObjectGuid GetCasterGUID() const
Definition SpellAuraEffects.h:48
Definition Unit.cpp:20092
uint64 CalculateQueueTime(uint64 delay) const
Definition EventProcessor.cpp:164

References EventProcessor::AddEvent(), EventProcessor::CalculateQueueTime(), CastCustomSpell(), CONFIG_MUNCHING_BLIZZLIKE, AuraEffect::GetCasterGUID(), AuraEffect::GetEffIndex(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetOldAmount(), AuraEffect::GetTickNumber(), AuraEffect::GetTotalTicks(), WorldObject::m_Events, m_modAuras, SPELLVALUE_BASE_POINT0, sWorld, TRIGGERED_FULL_MASK, and TRIGGERED_NO_PERIODIC_RESET.

Referenced by HandleDummyAuraProc(), spell_mage_ignite::HandleProc(), spell_dru_t10_balance_4p_bonus::HandleProc(), spell_sha_t10_restoration_4p_bonus::HandleProc(), spell_sha_t8_electrified::HandleProc(), and HandleProcTriggerSpell().

◆ CastPetAura()

void Unit::CastPetAura ( PetAura const *  aura)
17394{
17395 uint32 auraId = aura->GetAura(GetEntry());
17396 if (!auraId)
17397 return;
17398
17399 if (auraId == 35696) // Demonic Knowledge
17400 {
17401 int32 basePoints = aura->GetDamage();
17402 CastCustomSpell(this, auraId, &basePoints, nullptr, nullptr, true);
17403 }
17404 else
17405 CastSpell(this, auraId, true);
17406}

References CastCustomSpell(), CastSpell(), PetAura::GetAura(), PetAura::GetDamage(), and Object::GetEntry().

Referenced by Pet::CastPetAuras().

◆ CastSpell() [1/7]

SpellCastResult Unit::CastSpell ( float  x,
float  y,
float  z,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1292{
1293 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1294 if (!spellInfo)
1295 {
1296 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1298 }
1299
1300 SpellCastTargets targets;
1301 targets.SetDst(x, y, z, GetOrientation());
1302
1303 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1304}
void SetDst(float x, float y, float z, float orientation, uint32 mapId=MAPID_INVALID)
Definition Spell.cpp:406

References CastSpell(), Object::GetGUID(), Position::GetOrientation(), LOG_ERROR, SpellCastTargets::SetDst(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [2/7]

SpellCastResult Unit::CastSpell ( GameObject go,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1307{
1308 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1309 if (!spellInfo)
1310 {
1311 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1313 }
1314
1315 SpellCastTargets targets;
1316 targets.SetGOTarget(go);
1317
1318 return CastSpell(targets, spellInfo, nullptr, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1319}
void SetGOTarget(GameObject *target)
Definition Spell.cpp:271

References CastSpell(), Object::GetGUID(), LOG_ERROR, SpellCastTargets::SetGOTarget(), SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, Position::ToString(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [3/7]

SpellCastResult Unit::CastSpell ( SpellCastTargets const &  targets,
SpellInfo const *  spellInfo,
CustomSpellValues const *  value,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
Todo:
: this is a workaround - not needed anymore, but required for some scripts :(
1194{
1195 if (!spellInfo)
1196 {
1197 LOG_ERROR("entities.unit", "CastSpell: unknown spell by caster {}", GetGUID().ToString());
1199 }
1200
1202 if (!originalCaster && triggeredByAura)
1203 {
1204 originalCaster = triggeredByAura->GetCasterGUID();
1205 }
1206
1207 Spell* spell = new Spell(this, spellInfo, triggerFlags, originalCaster);
1208
1209 if (value)
1210 {
1211 for (CustomSpellValues::const_iterator itr = value->begin(); itr != value->end(); ++itr)
1212 {
1213 spell->SetSpellValue(itr->first, itr->second);
1214 }
1215 }
1216
1217 spell->m_CastItem = castItem;
1218 return spell->prepare(&targets, triggeredByAura);
1219}
void SetSpellValue(SpellValueMod mod, int32 value)
Definition Spell.cpp:8472
Item * m_CastItem
Definition Spell.h:524

References AuraEffect::GetCasterGUID(), Object::GetGUID(), LOG_ERROR, Spell::m_CastItem, Spell::prepare(), Spell::SetSpellValue(), SPELL_FAILED_SPELL_UNAVAILABLE, and Position::ToString().

Referenced by Player::_addSpell(), Player::_addTalentAurasAndSpells(), Spell::_cast(), _ExitVehicle(), Player::_LoadGlyphAuras(), Battleground::_ProcessResurrect(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_rog_cheat_death::Absorb(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Activate(), Player::ActivateSpec(), spell_halion_combustion_consumption_aura::AddMarkStack(), Battleground::AddPlayer(), Arena::AddPlayer(), BattlegroundIC::AddPlayer(), BattlegroundMap::AddPlayerToMap(), Battleground::AddPlayerToResurrectQueue(), Pet::addSpell(), spell_dru_barkskin::AfterApply(), spell_dru_savage_roar_aura::AfterApply(), spell_astromancer_wrath_of_the_astromancer::AfterRemove(), spell_gen_lifebloom::AfterRemove(), spell_oculus_stop_time_aura::Apply(), spell_sha_earthbind_totem::Apply(), spell_warl_health_funnel::ApplyEffect(), Player::ApplyEnchantment(), Player::ApplyEquipSpell(), spell_hun_lock_and_load::ApplyMarker(), npc_ritual_channeler::npc_ritual_channelerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), boss_grand_champion::boss_grand_championAI::boss_grand_championAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::boss_yoggsaron_crusher_tentacleAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::boss_yoggsaron_death_orbAI(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::boss_yoggsaron_influence_tentacleAI(), WorldState::BuffAdalsSongOfBattle(), WorldState::BuffMagtheridonTeam(), Player::BuildPlayerRepop(), spell_igb_incinerating_blast::CalculateDamage(), spell_igb_cannon_blast::CalculatePower(), npc_echo_of_medivh::CastChangeFacing(), npc_chesspiece::CastChangeFacing(), CastCustomSpell(), npc_hallows_end_soh::CastFires(), Player::CastItemCombatSpell(), npc_volatile_ooze::npc_volatile_oozeAI::CastMainSpell(), CastPetAura(), boss_mor_grayhoof::CastRandomSpell(), CastSpell(), CastSpell(), GameObject::CastSpell(), CastSpell(), CastSpell(), CastSpell(), CastSpell(), spell_the_lich_king_defile::ChangeDamageAndGrow(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), spell_eredar_twins_handle_touch::CheckCast(), Spell::CheckCast(), Spell::CheckItems(), spell_botanica_shift_form_aura::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), spell_the_lich_king_shadow_trap_periodic::CheckTargetCount(), spell_dk_raise_dead::ConsumeReagents(), spell_frost_giant_death_plague::CountTargets(), instance_blackrock_spire::instance_blackrock_spireMapScript::CreatureLooted(), violet_hold_trashAI::CreatureStartAttackDoor(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_jenny::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), DealMeleeDamage(), spell_warl_seed_of_corruption_aura::Detonate(), spell_warl_seed_of_corruption_generic_aura::Detonate(), boss_twin_valkyrAI::DoAction(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_icc_severed_essence::npc_icc_severed_essenceAI::DoAction(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), npc_eris_hevenfire::npc_eris_hevenfireAI::DoAction(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_flame_leviathan::boss_flame_leviathanAI::DoAction(), boss_magtheridon::DoAction(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), npc_kalecgos_kj::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_black_knight::boss_black_knightAI::DoAction(), boss_jormungarAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_icc_blood_beast::npc_icc_blood_beastAI::DoAction(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_molten_golem::npc_molten_golemAI::DoAction(), boss_steelbreaker::boss_steelbreakerAI::DoAction(), npc_ulduar_bot_summon_trigger::npc_ulduar_bot_summon_triggerAI::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DoAction(), boss_yoggsaron_keeper::DoAction(), Spell::DoAllEffectOnTarget(), UnitAI::DoCast(), UnitAI::DoCast(), UnitAI::DoCastAOE(), ScriptedAI::DoCastSpell(), InstanceScript::DoCastSpellOnPlayer(), InstanceScript::DoCastSpellOnPlayers(), UnitAI::DoCastToAllHostilePlayers(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), npc_midsummer_ribbon_pole_target::DoFireworkChecks(), npc_midsummer_ribbon_pole_target::DoGroundFlowerChecks(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), npc_midsummer_ribbon_pole_target::DoSpewLavaChecks(), boss_skeram::DoTeleport(), Spell::DoTriggersOnSpellHit(), Player::DuelComplete(), Spell::EffectActivateRune(), Spell::EffectApplyGlyph(), Spell::EffectCastButtons(), Spell::EffectDummy(), Spell::EffectEnergize(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectInebriate(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectStuck(), Spell::EffectSummonType(), Spell::EffectTaunt(), Spell::EffectTeleportUnits(), Spell::EffectTitanGrip(), Spell::EffectTriggerMissileSpell(), Spell::EffectTriggerRitualOfSummoning(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::EmpowerCultist(), boss_the_lich_king::boss_the_lich_kingAI::EnterEvadeMode(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), BattlegroundEY::EventTeamCapturedPoint(), BattleExperienceEvent::Execute(), OrcDeathEvent::Execute(), CorruptTriggers::Execute(), CastArmageddon::Execute(), UtherBatteredHiltEvent::Execute(), ShockVortexExplodeEvent::Execute(), ResetEncounterEvent::Execute(), FrostBombExplosion::Execute(), IceTombSummonEvent::Execute(), VileSpiritActivateEvent::Execute(), LichKingMovieEvent::Execute(), DelayedCastEvent::Execute(), DelayedCastMincharEvent::Execute(), ChargeRifts::Execute(), CosmicSmashDamageEvent::Execute(), CastRunesEvent::Execute(), BoomEvent::Execute(), SACActivateEvent::Execute(), VerasEnvenom::Execute(), CastQuill::Execute(), lapseTeleport::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_salramm::boss_salrammAI::ExplodeGhoul(), spell_festergut_blighted_spores_aura::ExtraEffect(), spell_rotface_mutated_infection_aura::ExtraRemoveEffect(), npc_dark_iron_attack_generator::FinishAttackDueToWin(), npc_azure_saboteur::npc_azure_saboteurAI::FinishPointReached(), npc_pet_dk_ebon_gargoyle::FlyAway(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::GoSiphon(), go_soulwell::go_soulwellAI::GossipHello(), spell_cataclysm_breath::HandleAfterCast(), spell_dk_chains_of_ice::HandleAfterCast(), spell_mage_arcane_blast::HandleAfterCast(), spell_q13086_last_line_of_defence::HandleAfterCast(), spell_braziers_hit::HandleAfterEffectApply(), spell_infected_worgen_bite_aura::HandleAfterEffectApply(), spell_dk_blood_boil::HandleAfterHit(), spell_dk_scourge_strike::HandleAfterHit(), spell_rog_deadly_poison::HandleAfterHit(), spell_warlords_rage::HandleAfterRemove(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), spell_felmyst_fog_of_corruption_charm_aura::HandleApply(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleApply(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), spell_dru_enrage::HandleApply(), spell_rog_killing_spree_aura::HandleApply(), spell_warr_vigilance::HandleApply(), spell_azjol_nerub_pound::HandleApplyAura(), BattlegroundIC::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModShapeshift(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_dk_death_grip::HandleBaseDummy(), misc_commandscript::HandleBindSightCommand(), spell_rotface_unstable_ooze_explosion_init::HandleCast(), spell_commander_sarannis_summon_reinforcements::HandleCast(), cast_commandscript::HandleCastBackCommand(), cast_commandscript::HandleCastCommand(), cast_commandscript::HandleCastDestCommand(), cast_commandscript::HandleCastDistCommand(), cast_commandscript::HandleCastSelfCommand(), cast_commandscript::HandleCastTargetCommad(), spell_gen_mounted_charge::HandleChargeEffect(), spell_dk_corpse_explosion::HandleCorpseExplosion(), OutdoorPvPSI::HandleCustomSpell(), WorldSession::HandleDuelCancelledOpcode(), spell_icc_shattered_bones::HandleDummy(), spell_corrupted_totems::HandleDummy(), spell_moroes_vanish::HandleDummy(), spell_karazhan_blink::HandleDummy(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_ooze_zap::HandleDummy(), spell_saviana_conflagration_init::HandleDummy(), spell_igb_burning_pitch_selector::HandleDummy(), spell_igb_burning_pitch::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_anti_air_rocket_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_illidan_found_target::HandleDummy(), spell_leotheras_chaos_blast::HandleDummy(), spell_morogrim_tidewalker_watery_grave::HandleDummy(), spell_q10935_the_exorcism_of_colonel_jules::HandleDummy(), spell_gen_focused_bursts::HandleDummy(), spell_shadowblink::HandleDummy(), spell_spawn_drakonid::HandleDummy(), spell_send_mug_target_picker::HandleDummy(), spell_hallows_end_candy::HandleDummy(), spell_hallows_end_bucket_lands::HandleDummy(), spell_midsummer_torch_catch::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_mana_burn_area::HandleDummy(), spell_voljin_war_drums::HandleDummy(), spell_voodoo::HandleDummy(), spell_sartharion_lava_strike::HandleDummy(), spell_halion_meteor_strike_targeting::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_drakkari_colossus_emerge::HandleDummy(), spell_drakkari_colossus_surge::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_voa_flaming_cinder::HandleDummy(), spell_q12096_q12092_dummy::HandleDummy(), spell_vehicle_warhead_fuse::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_najentus_needle_spine::HandleDummy(), spell_ice_spear_target_picker::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), spell_gen_cannibalize::HandleDummy(), spell_gen_gadgetzan_transporter_backfire::HandleDummy(), spell_gen_gnomish_transporter::HandleDummy(), spell_hun_masters_call::HandleDummy(), spell_hun_pet_carrion_feeder::HandleDummy(), spell_item_gnomish_universal_remote::HandleDummy(), spell_item_gnomish_shrink_ray::HandleDummy(), spell_item_trigger_spell::HandleDummy(), spell_item_deviate_fish::HandleDummy(), spell_item_flask_of_the_north::HandleDummy(), spell_item_make_a_wish::HandleDummy(), spell_item_mingos_fortune_generator::HandleDummy(), spell_item_net_o_matic::HandleDummy(), spell_item_noggenfogger_elixir::HandleDummy(), spell_item_savory_deviate_delight::HandleDummy(), spell_item_six_demon_bag::HandleDummy(), spell_item_underbelly_elixir::HandleDummy(), spell_item_vanquished_clutches::HandleDummy(), spell_item_purify_helboar_meat::HandleDummy(), spell_item_reindeer_transformation::HandleDummy(), spell_item_nigh_invulnerability::HandleDummy(), spell_item_poultryizer::HandleDummy(), spell_item_socrethars_stone::HandleDummy(), spell_item_demon_broiled_surprise::HandleDummy(), spell_item_complete_raptor_capture::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), spell_item_nitro_boots::HandleDummy(), spell_item_teach_language::HandleDummy(), spell_item_rocket_boots::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_item_greatmothers_soulcatcher::HandleDummy(), spell_mage_summon_water_elemental::HandleDummy(), spell_pal_blessing_of_faith::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pal_judgement_of_command::HandleDummy(), spell_pri_penance::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q5206_test_fetid_skull::HandleDummy(), spell_q11396_11399_scourging_crystal_controller::HandleDummy(), spell_q11587_arcane_prisoner_rescue::HandleDummy(), spell_q11730_ultrasonic_screwdriver::HandleDummy(), spell_q12634_despawn_fruit_tosser::HandleDummy(), spell_q12683_take_sputum_sample::HandleDummy(), spell_q12937_relief_for_the_fallen::HandleDummy(), spell_q9452_cast_net::HandleDummy(), spell_q13291_q13292_q13239_q13261_frostbrood_skytalon_grab_decoy::HandleDummy(), spell_q12308_escape_from_silverbrook::HandleDummy(), spell_q12641_death_comes_from_on_high::HandleDummy(), spell_rog_shiv::HandleDummy(), spell_sha_fire_nova::HandleDummy(), spell_warl_ritual_of_doom_effect::HandleDummy(), spell_warl_soulshatter::HandleDummy(), spell_warr_charge::HandleDummy(), spell_magtheridon_shadow_grasp::HandleDummyApply(), HandleDummyAuraProc(), spell_yogg_saron_destabilization_matrix::HandleDummyEffect(), spell_yogg_saron_insane_periodic_trigger::HandleDummyEffect(), spell_image_of_drakuru_reagent_check::HandleDummyEffect(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_talon_king_ikiss_blink::HandleDummyHitTarget(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_item_rocket_chicken::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_shadowfang_keep_haunting_spirits_aura::HandleDummyTick(), spell_blood_council_shadow_prison_aura::HandleDummyTick(), spell_mark_of_nature::HandleEffect(), spell_call_of_the_beast::HandleEffect(), spell_target_fissures::HandleEffect(), spell_rog_vanish::HandleEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_lich_king_vo_blocker::HandleEffectApply(), spell_midsummer_ribbon_pole::HandleEffectApply(), spell_tharon_ja_dummy_aura::HandleEffectApply(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectApply(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), spell_leotheras_insidious_whisper_aura::HandleEffectApply(), spell_serpentshrine_cavern_coilfang_water::HandleEffectApply(), spell_q12851_going_bearback::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_gen_whisper_gulch_yogg_saron_whisper::HandleEffectPeriodic(), spell_rog_killing_spree_aura::HandleEffectPeriodic(), spell_sha_earthbind_totem::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_warr_retaliation::HandleEffectProc(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_aura::HandleEffectRemove(), spell_illidan_parasitic_shadowfiend_trigger_aura::HandleEffectRemove(), spell_teron_gorefiend_shadow_of_death::HandleEffectRemove(), spell_black_temple_skeleton_shot_aura::HandleEffectRemove(), spell_hydross_cleansing_field_command::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite::HandleEffectRemove(), spell_serpentshrine_cavern_serpentshrine_parasite_trigger_aura::HandleEffectRemove(), spell_q10930_big_bone_worm_aura::HandleEffectRemove(), spell_q10929_fumping_aura::HandleEffectRemove(), spell_flamewreath::HandleFinish(), spell_midsummer_fling_torch::HandleFinish(), spell_midsummer_juggling_torch::HandleFinish(), spell_wintergrasp_rp_gg::HandleFinish(), spell_dreamwalker_summoner::HandleForceCast(), spell_dreamwalker_summon_suppresser_effect::HandleForceCast(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), OPvPCapturePointZM_Graveyard::HandleGossipOption(), spell_item_crazy_alchemists_potion::HandleHeal(), spell_magtheridon_quake::HandleHit(), spell_chapter5_return_to_capital::HandleHit(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), OutdoorPvPHP::HandleKillImpl(), OutdoorPvPNA::HandleKillImpl(), OutdoorPvPZM::HandleKillImpl(), BattlegroundIC::HandleKillUnit(), WorldSession::HandleMoveSplineDoneOpcode(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_ticking_time_bomb_aura::HandleOnEffectRemove(), spell_delusions_of_jindo::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), spell_mark_of_frost_freeze::HandleOnHit(), spell_mutate_explode_bug::HandleOnHit(), spell_explode_trigger::HandleOnHit(), spell_blade_dance_targeting::HandleOnHit(), HandleOverrideClassScriptAuraProc(), aura_class_call_wild_magic::HandlePeriodic(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_halion_meteor_strike_spread_aura::HandlePeriodic(), spell_sladran_grip_of_sladran_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_close_rift_aura::HandlePeriodic(), spell_serpentshrine_cavern_coilfang_water::HandlePeriodic(), spell_rancid_spore_cloud::HandlePeriodic(), spell_kaelthas_remote_toy::HandlePeriodic(), spell_q10923_evil_draws_near_periodic_aura::HandlePeriodic(), spell_sha_totemic_mastery::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_kiljaeden_shadow_spike_aura::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), spell_halion_twilight_cutter_periodic_aura::HandlePeriodic(), spell_oculus_ride_ruby_emerald_amber_drake_que_aura::HandlePeriodic(), spell_hun_sniper_training::HandlePeriodic(), spell_shadow_bolt_whirl::HandlePeriodic(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicDummyAuraTick(), spell_magtheridon_shadow_grasp::HandlePeriodicRemove(), spell_igb_periodic_trigger_with_power_cost_aura::HandlePeriodicTick(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), spell_bronjahm_soulstorm_channel_ooc_aura::HandlePeriodicTick(), spell_bronjahm_soulstorm_visual_aura::HandlePeriodicTick(), spell_item_direbrew_remote_aura::HandlePeriodicTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceMoveByAI(), WorldState::HandlePlayerEnterZone(), OutdoorPvPEP::HandlePlayerEnterZone(), OutdoorPvPHP::HandlePlayerEnterZone(), OutdoorPvPNA::HandlePlayerEnterZone(), OutdoorPvPSI::HandlePlayerEnterZone(), OutdoorPvPTF::HandlePlayerEnterZone(), OutdoorPvPZM::HandlePlayerEnterZone(), WorldSession::HandlePlayerLoginFromDB(), BattlegroundIC::HandlePlayerResurrect(), misc_commandscript::HandlePossessCommand(), spell_blood_queen_vampiric_bite::HandlePresence(), spell_mark_of_malice::HandleProc(), spell_item_lil_phylactery::HandleProc(), spell_item_fate_rune_of_unsurpassed_vigor::HandleProc(), spell_mage_burning_determination::HandleProc(), spell_rog_tricks_of_the_trade::HandleProc(), spell_gyth_chromatic_protection::HandleProc(), spell_karazhan_wrath_titans_aura::HandleProc(), spell_ahune_spanky_hands::HandleProc(), spell_item_trauma::HandleProc(), spell_item_shadows_fate::HandleProc(), spell_utgarde_pinnacle_beast_mark::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_hun_improved_mend_pet::HandleProc(), spell_hun_misdirection::HandleProc(), spell_item_aegis_of_preservation::HandleProc(), spell_item_desperate_defense::HandleProc(), spell_mage_focus_magic::HandleProc(), spell_pal_blessing_of_sanctuary::HandleProc(), spell_pri_item_greater_heal_refund::HandleProc(), spell_pri_mana_leech::HandleProc(), spell_warr_vigilance::HandleProc(), spell_karazhan_temptation::HandleProc(), spell_dk_blood_caked_blade::HandleProc(), spell_dk_dancing_rune_weapon::HandleProc(), spell_gen_moss_covered_feet::HandleProc(), spell_item_unsated_craving::HandleProc(), spell_item_shadowmourne::HandleProc(), spell_sha_item_lightning_shield::HandleProc(), spell_sha_item_lightning_shield_trigger::HandleProc(), spell_warl_glyph_of_shadowflame::HandleProc(), spell_warr_sweeping_strikes::HandleProc(), spell_hun_lock_and_load::HandleProcs(), HandleProcTriggerSpell(), AuraEffect::HandleProcTriggerSpellAuraProc(), WorldSession::HandleQuestgiverAcceptQuestOpcode(), AuraEffect::HandleRaidProcFromChargeAuraProc(), spell_dk_raise_dead::HandleRaiseDead(), spell_vael_burning_adrenaline::HandleRemove(), spell_kiljaeden_darkness_aura::HandleRemove(), spell_entropius_void_zone_visual_aura::HandleRemove(), spell_igb_rocket_pack_aura::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_gen_mine_sweeper::HandleSchoolDMG(), spell_warl_shadowflame::HandleSchoolDMG(), spell_gen_bandage::HandleScript(), spell_gen_translocate::HandleScript(), spell_pal_lay_on_hands::HandleScript(), spell_kormok_summon_bone_mages::HandleScript(), spell_kormok_summon_bone_minions::HandleScript(), spell_energize_aoe::HandleScript(), spell_saviana_conflagration_throwback::HandleScript(), spell_taldaram_glittering_sparks::HandleScript(), spell_blood_queen_bloodbolt::HandleScript(), spell_blood_queen_presence_of_the_darkfallen::HandleScript(), spell_igb_rocket_artillery::HandleScript(), spell_putricide_unstable_experiment::HandleScript(), spell_sindragosa_icy_grip::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_summon_spirit_bomb::HandleScript(), spell_dreamwalker_summon_portal::HandleScript(), spell_dreamwalker_twisted_nightmares::HandleScript(), spell_archavon_rock_shards::HandleScript(), spell_wintergrasp_portal::HandleScript(), spell_gen_create_lance::HandleScript(), spell_item_defibrillate::HandleScript(), spell_item_scroll_of_recall::HandleScript(), spell_shazzrah_gate_dummy::HandleScript(), spell_apothecary_lingering_fumes::HandleScript(), spell_apothecary_validate_area::HandleScript(), spell_apothecary_throw_cologne::HandleScript(), spell_apothecary_throw_perfume::HandleScript(), spell_hallows_end_trick::HandleScript(), spell_hallows_end_put_costume::HandleScript(), spell_hallows_end_trick_or_treat::HandleScript(), spell_winter_veil_mistletoe::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_moam_summon_mana_fiends::HandleScript(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), spell_mistress_kiss_area::HandleScript(), spell_novos_summon_minions::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_choking_gas_bomb::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_the_lich_king_cast_back_to_caster::HandleScript(), spell_frost_giant_death_plague::HandleScript(), spell_yogg_saron_target_selectors::HandleScript(), spell_the_black_stalker_levitate::HandleScript(), spell_the_black_stalker_levitation_pulse::HandleScript(), spell_the_black_stalker_someone_grab_me::HandleScript(), spell_the_black_stalker_magnetic_pull::HandleScript(), spell_the_flag_of_ownership::HandleScript(), spell_gen_elune_candle::HandleScript(), spell_gen_teleporting::HandleScript(), spell_gen_dalaran_disguise::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_item_dimensional_ripper_area52::HandleScript(), spell_item_eggnog::HandleScript(), spell_q12735_song_of_cleansing::HandleScript(), spell_q13011_bear_flank_master::HandleScript(), spell_q12619_emblazon_runeblade_effect::HandleScript(), spell_q12919_gymers_throw::HandleScript(), spell_kalecgos_spectral_realm_dummy::HandleScriptEffect(), spell_marrowgar_coldflame_bonestorm::HandleScriptEffect(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_black_temple_bloodbolt::HandleScriptEffect(), spell_lady_vashj_summon_sporebat::HandleScriptEffect(), spell_kaelthas_summon_weapons::HandleScriptEffect(), spell_kaelthas_gravity_lapse::HandleScriptEffect(), spell_kaelthas_nether_beam::HandleScriptEffect(), spell_gen_clone::HandleScriptEffect(), spell_gen_clone_weapon::HandleScriptEffect(), spell_gen_break_shield::HandleScriptEffect(), spell_gen_mounted_charge::HandleScriptEffect(), spell_gen_throw_shield::HandleScriptEffect(), spell_item_sleepy_willy::HandleScriptEffect(), spell_item_lil_xt::HandleScriptEffect(), spell_q12698_the_gift_that_keeps_on_giving::HandleScriptEffect(), spell_death_knight_initiate_visual::HandleScriptEffect(), spell_summon_amanishi_sentries::HandleScriptEffect(), spell_brewfest_toss_mug::HandleScriptEffect(), spell_direbrew_summon_mole_machine_target_picker::HandleScriptEffect(), spell_request_second_mug::HandleScriptEffect(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), spell_dtk_summon_random_drakkari::HandleScriptEffect(), spell_marrowgar_coldflame::HandleScriptEffect(), spell_arcane_chains_character_force_cast::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), spell_black_temple_summon_shadowfiends::HandleScriptEffect(), spell_ice_bombardment_dest_picker::HandleScriptEffect(), spell_kaelthas_remove_enchanted_weapons::HandleScriptEffect(), spell_kaelthas_kael_explodes::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_hun_masters_call::HandleScriptEffect(), spell_item_mirrens_drinking_hat::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), spell_q1846_bending_shinbone::HandleScriptEffect(), spell_q14112_14145_chum_the_water::HandleScriptEffect(), WorldSession::HandleSelfResOpcode(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), HandleSpellClick(), spell_marrowgar_bone_spike_graveyard::HandleSpikes(), AuraEffect::HandleSpiritOfRedemption(), spell_gen_paralytic_poison::HandleStun(), spell_putricide_mutated_transformation::HandleSummon(), spell_item_draenic_pale_ale::HandleSummon(), WorldSession::HandleTalentWipeConfirmOpcode(), spell_mother_shahraz_fatal_attraction::HandleTeleportUnits(), spell_warl_drain_soul::HandleTick(), WorldSession::HandleTrainerBuySpellOpcode(), spell_trigger_spell_from_caster::HandleTrigger(), spell_magic_eater_food::HandleTriggerSpell(), spell_alert_drums::HandleTriggerSpell(), spell_winter_veil_racer_rocket_slam::HandleTriggerSpell(), spell_pal_righteous_defense::HandleTriggerSpellHit(), boss_onyxia::HandleWhelpSpam(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), boss_ichoron::boss_ichoronAI::IchoronDoCastToAllHostilePlayers(), spell_q10769_dissension_amongst_the_ranks_aura::if(), CharmInfo::InitCharmCreateSpells(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InitFight(), npc_jenny::Initialize(), boss_urok_doomhowl::boss_urok_doomhowlAI::InitializeAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::InitializeAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::InitializeAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::InitializeAI(), boss_gal_darah::boss_gal_darahAI::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), CharmInfo::InitPossessCreateSpells(), Guardian::InitStatsForLevel(), Totem::InitSummon(), boss_faction_championsAI::IsCCed(), npc_living_inferno::npc_living_infernoAI::IsSummonedBy(), TriggerAI::IsSummonedBy(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_bone_spike::npc_bone_spikeAI::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_pet_gen_fetch_ball::IsSummonedBy(), npc_hallows_end_soh::JustDied(), boss_rajaxx::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), npc_swarm_scarab::npc_swarm_scarabAI::JustDied(), npc_phantom_hallucination::npc_phantom_hallucinationAI::JustDied(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::JustDied(), npc_gunship::npc_gunshipAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::JustDied(), boss_steelbreaker::boss_steelbreakerAI::JustDied(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_freya_summons::boss_freya_summonsAI::JustDied(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::JustDied(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::JustDied(), boss_skarvald_the_constructor::JustDied(), boss_dalronn_the_controller::JustDied(), npc_ichor_globule::npc_ichor_globuleAI::JustDied(), boss_fathomguard_sharkkis::JustDied(), boss_fathomguard_tidalvess::JustDied(), boss_fathomguard_caribdis::JustDied(), npc_necropolis_health::JustDied(), CombatAI::JustDied(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_tharon_ja::boss_tharon_jaAI::JustDied(), boss_sapphiron::boss_sapphironAI::JustDied(), boss_anomalus::JustDied(), npc_nerubar_victim::npc_nerubar_victimAI::JustDied(), boss_shade_of_akama::JustDied(), CasterAI::JustEngagedWith(), boss_servant_quarters::JustEngagedWith(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_hallows_end_soh::JustEngagedWith(), boss_eadric::boss_eadricAI::JustEngagedWith(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustEngagedWith(), boss_twin_valkyrAI::JustEngagedWith(), boss_garfrost::boss_garfrostAI::JustEngagedWith(), npc_stinky_icc::npc_stinky_iccAI::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), npc_rimefang::npc_rimefangAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_freya::boss_freyaAI::JustEngagedWith(), boss_freya_summons::boss_freya_summonsAI::JustEngagedWith(), boss_vezax::boss_vezaxAI::JustEngagedWith(), boss_hodir::boss_hodirAI::JustEngagedWith(), boss_thorim::boss_thorimAI::JustEngagedWith(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustEngagedWith(), boss_koralon::boss_koralonAI::JustEngagedWith(), boss_toravon::boss_toravonAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustEngagedWith(), boss_moragg::boss_moraggAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_watchkeeper_gargolmar::JustEngagedWith(), boss_gatewatcher_gyrokill::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), CombatAI::JustEngagedWith(), boss_yauj::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_moorabi::boss_moorabiAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), boss_sapphiron::boss_sapphironAI::JustEngagedWith(), boss_keristrasza::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_fathomlord_karathress::JustEngagedWith(), boss_fathomguard_sharkkis::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustReachedHome(), boss_bronjahm::boss_bronjahmAI::JustReachedHome(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustReachedHome(), boss_gal_darah::boss_gal_darahAI::JustReachedHome(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::JustReachedHome(), boss_freya::boss_freyaAI::JustSummoned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_skeram::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_ragnaros::boss_ragnarosAI::JustSummoned(), boss_vexallus::JustSummoned(), boss_kiljaeden::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_jindo::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_taldaram::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_gal_darah::boss_gal_darahAI::JustSummoned(), boss_prince_valanar_icc::boss_prince_valanarAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::JustSummoned(), boss_malygos::boss_malygosAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_svala::boss_svalaAI::JustSummoned(), boss_shirrak_the_dead_watcher::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), boss_grandmaster_vorpil::JustSummoned(), boss_gurtogg_bloodboil::JustSummoned(), boss_veras_darkshadow::JustSummoned(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::JustSummoned(), boss_supremus::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), npc_pallid_horror::JustSummoned(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::JustSummoned(), boss_ayamiss::JustSummoned(), Kill(), boss_azuregos::boss_azuregosAI::KilledUnit(), boss_anubrekhan::boss_anubrekhanAI::KilledUnit(), boss_doomwalker::KilledUnit(), npc_dark_iron_guzzler::KilledUnit(), boss_steelbreaker::boss_steelbreakerAI::KilledUnit(), emerald_dragonAI::KilledUnit(), boss_emeriss::boss_emerissAI::KilledUnit(), boss_felblood_kaelthas::LapseAction(), spell_mandokir_charge::LaunchHit(), Player::learnQuestRewardedSpells(), spell_taldaram_summon_flame_ball::Load(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_brewfest_keg_thrower::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_love_in_air_snivel::MoveInLineOfSight(), boss_temporus::MoveInLineOfSight(), npc_medivh_bm::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), npc_guardian_pavilion::npc_guardian_pavilionAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_spirit_shade::npc_spirit_shadeAI::MovementInform(), npc_unworthy_initiate::npc_unworthy_initiateAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_eck::boss_eckAI::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::MovementInform(), boss_malygos::boss_malygosAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::MovementInform(), boss_headless_horseman::MovementInform(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::MovementInform(), npc_ashtongue_sorcerer::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), boss_kagani_nightstrike::MovementInform(), npc_dark_iron_guzzler::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_assembly_lightning::npc_assembly_lightningAI::MovementInform(), boss_ymiron::boss_ymironAI::MovementInform(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), BattlegroundAB::NodeOccupied(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::npc_algalon_worm_holeAI(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_concentrated_ball::npc_concentrated_ballAI::npc_concentrated_ballAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_frost_tomb::npc_frost_tomb(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_power_spark::npc_power_sparkAI::npc_power_sparkAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::npc_ulduar_iron_constructAI(), npc_ulduar_toasty_fire::npc_ulduar_toasty_fireAI::npc_ulduar_toasty_fireAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), spell_shadowfang_keep_forsaken_skills_aura::OnApply(), spell_direbrew_disarm::OnApply(), spell_love_is_in_the_air_romantic_picnic::OnApply(), spell_halion_combustion_consumption_aura::OnApply(), spell_load_into_catapult_aura::OnApply(), spell_gen_damage_reduction_aura::OnApply(), spell_gruul_ground_slam_trigger::OnApply(), spell_hun_ascpect_of_the_viper::OnApply(), spell_hun_viper_attack_speed::OnApply(), spell_item_with_mount_speed::OnApply(), spell_blood_queen_vampiric_bite::OnCast(), npc_chesspiece::OnCharmed(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_item_linken_boomerang::OnEffectLaunchTargetDisarm(), spell_item_linken_boomerang::OnEffectLaunchTargetStun(), npc_essence_of_twin::OnGossipHello(), npc_alchemist_adrianna::OnGossipHello(), go_inconspicuous_mine_car::OnGossipHello(), go_manticron_cube::OnGossipHello(), go_seer_of_zebhalak::OnGossipHello(), go_jump_a_tron::OnGossipHello(), go_orb_of_domination::OnGossipHello(), go_scourge_enclosure::OnGossipHello(), go_strange_pool::OnGossipHello(), go_simon_cluster::OnGossipHello(), go_tablet_of_the_seven::OnGossipHello(), go_arcane_prison::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), npc_steward_of_time::OnGossipSelect(), npc_iruk::OnGossipSelect(), npc_zephyr::OnGossipSelect(), npc_taxi::OnGossipSelect(), npc_locksmith::OnGossipSelect(), npc_engineering_tele_trinket::OnGossipSelect(), npc_sayge::OnGossipSelect(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_lokhtos_darkbargainer::OnGossipSelect(), boss_gloomrel::OnGossipSelect(), npc_death_knight_initiate::OnGossipSelect(), npc_parqual_fintallas::OnGossipSelect(), npcs_riverbreeze_and_silversky::OnGossipSelect(), npc_braug_dimspirit::OnGossipSelect(), npc_avatar_of_freya::OnGossipSelect(), npc_adventurous_dwarf::OnGossipSelect(), npc_wg_demolisher_engineer::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), npc_wormhole::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), go_amberpine_outhouse::OnGossipSelect(), go_fel_crystalforge::OnGossipSelect(), go_bashir_crystalforge::OnGossipSelect(), go_apexis_relic::OnGossipSelect(), Player::OnGossipSelect(), spell_summon_all_players_dummy::OnHit(), spell_apothecary_perfume_spill::OnPeriodic(), spell_apothecary_cologne_spill::OnPeriodic(), spell_muru_summon_blood_elves_periodic_aura::OnPeriodic(), spell_claw_rage_aura::OnPeriodic(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_anubisath_mortal_strike::OnPeriodic(), spell_the_lich_king_soul_reaper_aura::OnPeriodic(), spell_yogg_saron_brain_link_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_illidan_tear_of_azzinoth_summon_channel_aura::OnPeriodic(), spell_illidan_demon_transform1_aura::OnPeriodic(), spell_illidan_cage_trap_stun_aura::OnPeriodic(), spell_black_temple_dementia_aura::OnPeriodic(), spell_npc22275_crystal_prison_aura::OnPeriodic(), spell_item_eye_of_grillok_aura::OnPeriodic(), spell_kalecgos_curse_of_boundless_agony_aura::OnPeriodic(), spell_muru_darkness_aura::OnPeriodic(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_the_lich_king_vile_spirits_aura::OnPeriodic(), spell_web_wrap_damage::OnPeriodic(), spell_assembly_rune_of_summoning_aura::OnPeriodic(), spell_thorim_lightning_pillar_P2_aura::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), spell_karathress_power_of_tidalvess::OnPeriodic(), spell_karathress_power_of_caribdis::OnPeriodic(), spell_leotheras_demon_link::OnPeriodic(), spell_lurker_below_spout::OnPeriodic(), spell_gen_periodic_knock_away::OnPeriodic(), spell_gen_turkey_marker::OnPeriodic(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnPlayerInWaterStateUpdate(), BattlefieldWG::OnPlayerJoinWar(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_gen_proc_on_victim::OnProc(), npc_steward_of_time::OnQuestAccept(), npc_mikhail::OnQuestAccept(), npc_rocknot::OnQuestReward(), npc_thrall_bfu::OnQuestReward(), spell_kalecgos_spectral_realm_aura::OnRemove(), spell_azgalor_doom_aura::OnRemove(), spell_boss_salramm_steal_flesh_aura::OnRemove(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_putricide_mutation_init_aura::OnRemove(), spell_the_lich_king_shadow_trap_visual_aura::OnRemove(), spell_the_lich_king_harvest_soul_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_ioc_repair_turret_aura::OnRemove(), spell_kaelthas_flame_strike::OnRemove(), spell_item_goblin_weather_machine_aura::OnRemove(), spell_warl_curse_of_doom::OnRemove(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), spell_item_shadowmourne_soul_fragment::OnStackChange(), at_hor_battered_hilt_throw::OnTrigger(), at_frozen_throne_teleport::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_stormwright_shelf::OnTrigger(), npc_wintergarde_gryphon::PassengerBoarded(), npc_four_car_garage::npc_four_car_garageAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), spell_quest_test_flight_charging::PerformKick(), spell_send_mug_control_aura::PeriodicTick(), spell_barreled_control_aura::PeriodicTick(), spell_dreamwalker_summon_suppresser_aura::PeriodicTick(), spell_summon_ice_spear_delayer::PeriodicTick(), spell_summoning_rhyme_aura::PeriodicTick(), spell_halion_twilight_phasing::Phase(), BattlegroundAV::PopulateNode(), spell_azjol_nerub_carrion_beetels::PrepareAuraScript(), spell_item_oracle_ablutions::PrepareSpellScript(), spell_q11653_youre_not_so_big_now::PrepareSpellScript(), spell_q13369_fate_up_against_your_will::PrepareSpellScript(), SmartScript::ProcessAction(), ProcessCastaction(), Player::ProcessDelayedOperations(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::ProcessEvent(), ProcessTerrainStatusUpdate(), ProcessUnlearnAction(), BattlefieldWG::PromotePlayer(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), spell_gen_defend::RefreshVisualShields(), Vehicle::RemovePassenger(), spell_igb_below_zero::RemovePassengers(), boss_keristrasza::RemovePrison(), Player::ReportedAfkBy(), GuardAI::Reset(), npc_demonic_vapor::Reset(), npc_demonic_vapor_trail::Reset(), npc_batrider::Reset(), npc_dark_iron_guzzler::Reset(), boss_headless_horseman_pumpkin::Reset(), npc_taretha::npc_tarethaAI::Reset(), npc_medivh_bm::Reset(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_nerubian_burrower::npc_nerubian_burrowerAI::Reset(), boss_tharon_ja::boss_tharon_jaAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_elemental::boss_drakkari_elementalAI::Reset(), npc_dark_nucleus::npc_dark_nucleusAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_anomalus::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_freya_lifebinder::boss_freya_lifebinderAI::Reset(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::Reset(), boss_freya_nature_bomb::boss_freya_nature_bombAI::Reset(), boss_thorim_lightning_orb::boss_thorim_lightning_orbAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::Reset(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_yoggsaron_voice::boss_yoggsaron_voiceAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_frozen_orb::npc_frozen_orbAI::Reset(), npc_frozen_orb_stalker::npc_frozen_orb_stalkerAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::Reset(), npc_ashtongue_channeler::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), boss_wrath_scryer_soccothrates::Reset(), npc_training_dummy::npc_training_dummyAI::Reset(), BfGraveyard::Resurrect(), Resurrect(), Player::ResurrectPlayer(), Player::RewardQuest(), boss_bjarngrim::boss_bjarngrimAI::RollStance(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), Map::ScriptsProcess(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::SelectT(), npc_sayge::SendAction(), go_skull_pile::SendActionMenu(), npc_xt002_heart::npc_xt002_heartAI::SendEnergyToCorner(), Player::SendInitialPacketsAfterAddToMap(), Player::SendQuestUpdate(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), npc_eastvale_peasent::SetData(), SetModelVisible(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), npc_stable_master::npc_stable_masterAI::sGossipSelect(), npc_brewfest_keg_reciver::sGossipSelect(), npc_cairne_bloodhoof::npc_cairne_bloodhoofAI::sGossipSelect(), npc_chesspiece::sGossipSelect(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::sGossipSelect(), npc_zafod_boombox::npc_zafod_boomboxAI::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_cultist_engineer::sGossipSelect(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_skadi_grauf::boss_skadi_graufAI::SpawnFlameTriggers(), boss_malchezaar::SpawnInfernal(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), boss_eadric::boss_eadricAI::SpellHit(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_ichor_globule::npc_ichor_globuleAI::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_franklin::npc_franklinAI::SpellHit(), npc_necropolis_relay::SpellHit(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_headless_horseman::SpellHit(), boss_thorim_pillar::boss_thorim_pillarAI::SpellHit(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::SpellHit(), npc_necropolis_proxy::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_living_constellation::npc_living_constellationAI::SpellHit(), boss_ignis::boss_ignisAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_soh_fire_trigger::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_magus_telestra::SpellHit(), boss_thorim::boss_thorimAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_bronjahm::boss_bronjahmAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_felmyst::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_rotface::boss_rotfaceAI::SpellHitTarget(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), boss_hodir::boss_hodirAI::SpellHitTarget(), npc_ulduar_rocket_strike_trigger::npc_ulduar_rocket_strike_triggerAI::SpellHitTarget(), npc_q24545_lich_king::npc_q24545_lich_kingAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), boss_epoch::boss_epochAI::SpellHitTarget(), boss_sapphiron::boss_sapphironAI::SpellHitTarget(), boss_skadi_grauf::boss_skadi_graufAI::SpellHitTarget(), boss_shirrak_the_dead_watcher::SpellHitTarget(), npc_pet_gen_soul_trader_beacon::SpellHitTarget(), Battleground::SpiritOfCompetitionEvent(), boss_ionar::boss_ionarAI::Split(), boss_heigan::boss_heiganAI::StartFightPhase(), npc_finklestein::npc_finklesteinAI::StartNextTask(), Player::StoreItem(), spell_dk_ghoul_explode::Suicide(), boss_anzu::SummonBroods(), boss_anubrekhan::boss_anubrekhanAI::SummonedCreatureDies(), boss_cthun::SummonedCreatureDies(), boss_vexallus::SummonedCreatureDies(), boss_paletress::boss_paletressAI::SummonMemory(), go_wind_stone::go_wind_stoneAI::SummonNPC(), spell_igb_check_for_players::TeleportPlayer(), BattlegroundSA::TeleportToEntrancePosition(), spell_midsummer_fling_torch::ThrowNextTorch(), TriggerBurningPitch(), npc_orb_carrier::npc_orb_carrierAI::TriggerCutter(), spell_koralon_meteor_fists_aura::TriggerFists(), spell_flame_warder_meteor_fists_aura::TriggerFists(), spell_gen_holiday_buff_food::TriggerFoodBuff(), spell_karazhan_brittle_bones_aura::Update(), spell_black_temple_curse_of_the_bleakheart_aura::Update(), spell_illidari_council_deadly_strike_aura::Update(), spell_mother_shahraz_random_periodic_aura::Update(), spell_mother_shahraz_beam_periodic_aura::Update(), spell_mother_shahraz_saber_lash_aura::Update(), spell_black_temple_charge_rage_aura::Update(), Pet::Update(), GameObject::Update(), TotemAI::UpdateAI(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_image_of_medivh::npc_image_of_medivhAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_demonic_vapor::UpdateAI(), npc_demonic_vapor_trail::UpdateAI(), npc_kalecgos_kj::UpdateAI(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_brewfest_super_brew_trigger::UpdateAI(), npc_hallows_end_train_fire::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_headless_horseman_head::UpdateAI(), boss_headless_horseman_pumpkin::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), npc_time_rift::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_tharnarian::npc_tharnarianAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), npc_halion_controller::npc_halion_controllerAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_swarm_scarab::npc_swarm_scarabAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_druid::npc_toc_druidAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_paladin::npc_toc_paladinAI::UpdateAI(), npc_toc_priest::npc_toc_priestAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), npc_pos_icicle_trigger::npc_pos_icicle_triggerAI::UpdateAI(), npc_pos_collapsing_icicle::npc_pos_collapsing_icicleAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::UpdateAI(), boss_heigan::boss_heiganAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), npc_alexstrasza::npc_alexstraszaAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), npc_crystal_spike::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_freya_nature_bomb::boss_freya_nature_bombAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_saronite_animus::npc_ulduar_saronite_animusAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_icicle::npc_ulduar_icicleAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), npc_ulduar_proximity_mine::npc_ulduar_proximity_mineAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron_guardian_of_ys::boss_yoggsaron_guardian_of_ysAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_thassarian::npc_thassarianAI::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_jungle_punch_target::npc_jungle_punch_targetAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_queue::npc_wg_queueAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_invis_infernal_caster::npc_invis_infernal_casterAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), trigger_periodic::trigger_periodicAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_maexxna_webwrap::boss_maexxna_webwrapAI::UpdateAI(), npc_living_poison::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_q24545_vegard_dummy::npc_q24545_vegard_dummyAI::UpdateAI(), Player::UpdateAreaDependentAuras(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdatePhase(), Player::UpdateZoneDependentAuras(), GameObject::Use(), Player::VehicleSpellInitialize(), boss_bjarngrim::boss_bjarngrimAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), and npc_engineer_helice::npc_engineer_heliceAI::WaypointReached().

◆ CastSpell() [4/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1239{
1240 return CastSpell(victim, spellInfo, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1241}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [5/7]

SpellCastResult Unit::CastSpell ( Unit victim,
SpellInfo const *  spellInfo,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1244{
1245 SpellCastTargets targets;
1246 targets.SetUnitTarget(victim);
1247 return CastSpell(targets, spellInfo, nullptr, triggerFlags, castItem, triggeredByAura, originalCaster);
1248}

References CastSpell(), and SpellCastTargets::SetUnitTarget().

◆ CastSpell() [6/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
bool  triggered,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1222{
1223 return CastSpell(victim, spellId, triggered ? TRIGGERED_FULL_MASK : TRIGGERED_NONE, castItem, triggeredByAura, originalCaster);
1224}

References CastSpell(), TRIGGERED_FULL_MASK, and TRIGGERED_NONE.

◆ CastSpell() [7/7]

SpellCastResult Unit::CastSpell ( Unit victim,
uint32  spellId,
TriggerCastFlags  triggerFlags = TRIGGERED_NONE,
Item castItem = nullptr,
AuraEffect const *  triggeredByAura = nullptr,
ObjectGuid  originalCaster = ObjectGuid::Empty 
)
1227{
1228 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellId);
1229 if (!spellInfo)
1230 {
1231 LOG_ERROR("entities.unit", "CastSpell: unknown spell {} by caster {}", spellId, GetGUID().ToString());
1233 }
1234
1235 return CastSpell(victim, spellInfo, triggerFlags, castItem, triggeredByAura, originalCaster);
1236}

References CastSpell(), Object::GetGUID(), LOG_ERROR, SPELL_FAILED_SPELL_UNAVAILABLE, sSpellMgr, and Position::ToString().

◆ CastStop()

◆ ChangeSeat()

void Unit::ChangeSeat ( int8  seatId,
bool  next = true 
)
19536{
19537 if (!m_vehicle)
19538 return;
19539
19540 if (seatId < 0)
19541 {
19542 seatId = m_vehicle->GetNextEmptySeat(GetTransSeat(), next);
19543 if (seatId < 0)
19544 return;
19545 }
19546 else if (seatId == GetTransSeat() || !m_vehicle->HasEmptySeat(seatId))
19547 return;
19548
19550 if (!m_vehicle->AddPassenger(this, seatId))
19551 ABORT();
19552}
int8 GetNextEmptySeat(int8 seatId, bool next) const
Definition Vehicle.cpp:246
bool HasEmptySeat(int8 seatId) const
Definition Vehicle.cpp:220

References ABORT, Vehicle::AddPassenger(), Vehicle::GetNextEmptySeat(), WorldObject::GetTransSeat(), Vehicle::HasEmptySeat(), m_vehicle, and Vehicle::RemovePassenger().

Referenced by _EnterVehicle(), and WorldSession::HandleChangeSeatsOnControlledVehicle().

◆ CleanupBeforeRemoveFromMap()

void Unit::CleanupBeforeRemoveFromMap ( bool  finalCleanup)
15819{
15821 return;
15822
15823 // This needs to be before RemoveFromWorld to make GetCaster() return a valid pointer on aura removal
15825
15826 if (IsInWorld()) // not in world and not being removed atm
15828
15829 ASSERT(GetGUID());
15830
15831 // A unit may be in removelist and not in world, but it is still in grid
15832 // and may have some references during delete
15835
15836 if (finalCleanup)
15837 m_cleanupDone = true;
15838
15839 CombatStop();
15844 GetMotionMaster()->Clear(false); // remove different non-standard movement generators.
15845}
void deleteReferences(bool removeFromMap=false)
Definition HostileRefMgr.cpp:125
void Clear(bool reset=true)
Definition MotionMaster.h:167
void ClearAllThreat()
Definition ThreatMgr.cpp:417
void CombatStop(bool includingCast=false)
Definition Unit.cpp:10522
void RemoveAllGameObjects()
Definition Unit.cpp:6350
void ClearComboPoints()
Definition Unit.cpp:16936
void ClearComboPointHolders()
Definition Unit.cpp:16991
HostileRefMgr & getHostileRefMgr()
Definition Unit.h:902
void RemoveFromWorld() override
Definition Unit.cpp:15772
void RemoveAllAuras()
Definition Unit.cpp:5375
ThreatMgr & GetThreatMgr()
Definition Unit.h:898

References ASSERT, MotionMaster::Clear(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearComboPoints(), CombatStop(), HostileRefMgr::deleteReferences(), Object::GetGUID(), getHostileRefMgr(), GetMotionMaster(), GetThreatMgr(), InterruptNonMeleeSpells(), IsDuringRemoveFromWorld(), Object::IsInWorld(), m_cleanupDone, RemoveAllAuras(), RemoveAllGameObjects(), and RemoveFromWorld().

Referenced by CleanupsBeforeDelete().

◆ CleanupsBeforeDelete()

void Unit::CleanupsBeforeDelete ( bool  finalCleanup = true)
overridevirtual

Reimplemented from WorldObject.

15848{
15849 if (GetTransport())
15850 {
15852 SetTransport(nullptr);
15855 }
15856
15857 CleanupBeforeRemoveFromMap(finalCleanup);
15858}
virtual void RemovePassenger(WorldObject *passenger, bool withAll=false)=0
void CleanupBeforeRemoveFromMap(bool finalCleanup)
Definition Unit.cpp:15818
void SetTransport(Transport *t)
Definition Object.h:656
void Reset()
Definition Object.h:299
void RemoveMovementFlag(uint32 flag)
Definition Object.h:345

References CleanupBeforeRemoveFromMap(), WorldObject::GetTransport(), WorldObject::m_movementInfo, MOVEMENTFLAG_ONTRANSPORT, MovementInfo::RemoveMovementFlag(), Transport::RemovePassenger(), MovementInfo::TransportInfo::Reset(), WorldObject::SetTransport(), and MovementInfo::transport.

Referenced by Player::CleanupsBeforeDelete(), npc_commandscript::HandleNpcAddCommand(), and Map::RemoveAllObjectsInRemoveList().

◆ ClearAllReactives()

void Unit::ClearAllReactives ( )
17000{
17001 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17002 m_reactiveTimer[i] = 0;
17003
17010}
@ CLASS_HUNTER
Definition SharedDefines.h:143
@ CLASS_WARRIOR
Definition SharedDefines.h:141
@ AURA_STATE_DEFENSE
Definition SharedDefines.h:1292
@ AURA_STATE_HUNTER_PARRY
Definition SharedDefines.h:1298
@ CLASS_CONTEXT_ABILITY_REACTIVE
Definition UnitDefines.h:235
virtual bool IsClass(Classes unitClass, ClassContext context=CLASS_CONTEXT_NONE) const
Definition Unit.h:794
bool HasAuraState(AuraStateType flag, SpellInfo const *spellProto=nullptr, Unit const *Caster=nullptr) const
Definition Unit.cpp:10633

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), Object::IsPlayer(), m_reactiveTimer, MAX_REACTIVE, and ModifyAuraState().

Referenced by Player::ActivateSpec(), and setDeathState().

◆ ClearComboPointHolders()

void Unit::ClearComboPointHolders ( )
16992{
16993 while (!m_ComboPointHolders.empty())
16994 {
16995 (*m_ComboPointHolders.begin())->ClearComboPoints(); // this also removes it from m_comboPointHolders
16996 }
16997}

References ClearComboPoints(), and m_ComboPointHolders.

Referenced by CreatureAI::_EnterEvadeMode(), CleanupBeforeRemoveFromMap(), Player::RemoveFromWorld(), and setDeathState().

◆ ClearComboPoints()

void Unit::ClearComboPoints ( )
16937{
16938 if (!m_comboTarget)
16939 {
16940 return;
16941 }
16942
16943 // remove Premed-like effects
16944 // (NB: this Aura retains the CP while it's active - now that CP have reset, it shouldn't be there anymore)
16946
16947 m_comboPoints = 0;
16950 m_comboTarget = nullptr;
16951}
@ SPELL_AURA_RETAIN_COMBO_POINTS
Definition SpellAuraDefines.h:211

References m_comboPoints, m_comboTarget, RemoveAurasByType(), RemoveComboPointHolder(), SendComboPoints(), and SPELL_AURA_RETAIN_COMBO_POINTS.

Referenced by Spell::_handle_finish_phase(), CleanupBeforeRemoveFromMap(), ClearAllReactives(), ClearComboPointHolders(), Player::DuelComplete(), Player::RemoveFromWorld(), Player::setDeathState(), and UpdateReactives().

◆ ClearDiminishings()

void Unit::ClearDiminishings ( )
inline
1776{ m_Diminishing.clear(); }

References m_Diminishing.

Referenced by setDeathState().

◆ ClearEmoteState()

void Unit::ClearEmoteState ( )
inline

Sets emote state (looping emote). Emotes available in SharedDefines.h.

void SetEmoteState(Emote emoteState)
Definition Unit.h:713

References EMOTE_ONESHOT_NONE, and SetEmoteState().

Referenced by boss_felblood_kaelthas::DoAction().

◆ ClearInCombat()

void Unit::ClearInCombat ( )
13900{
13901 m_CombatTimer = 0;
13903
13904 // Player's state will be cleared in Player::UpdateContestedPvP
13905 if (Creature* creature = ToCreature())
13906 {
13907 if (creature->GetCreatureTemplate() && creature->GetCreatureTemplate()->unit_flags & UNIT_FLAG_IMMUNE_TO_PC)
13908 SetImmuneToPC(true); // set immunity state to the one from db on evade
13909
13912 ReplaceAllDynamicFlags(creature->GetCreatureTemplate()->dynamicflags);
13913
13914 creature->SetAssistanceTimer(0);
13915
13916 // Xinef: will be recalculated at follow movement generator initialization
13917 if (!IsPet() && !IsCharmed())
13918 return;
13919 }
13920 else if (Player* player = ToPlayer())
13921 {
13922 player->UpdatePotionCooldown();
13923 if (player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
13924 for (uint8 i = 0; i < MAX_RUNES; ++i)
13925 player->SetGracePeriod(i, 0);
13926 }
13927
13928 if (Player* player = this->ToPlayer())
13929 {
13930 sScriptMgr->OnPlayerLeaveCombat(player);
13931 }
13932}
#define MAX_RUNES
Definition Player.h:404
@ CLASS_DEATH_KNIGHT
Definition SharedDefines.h:146
@ CLASS_CONTEXT_ABILITY
Definition UnitDefines.h:234
@ UNIT_STATE_ATTACK_PLAYER
Definition UnitDefines.h:184
@ UNIT_FLAG_IN_COMBAT
Definition UnitDefines.h:269
@ UNIT_FLAG_IMMUNE_TO_PC
Definition UnitDefines.h:258
void ReplaceAllDynamicFlags(uint32 flag) override
Definition Unit.h:724
bool IsCharmed() const
Definition Unit.h:1237
bool IsPet() const
Definition Unit.h:747
void SetImmuneToPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13691
void RemoveUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:704

References CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, ClearUnitState(), Object::HasDynamicFlag(), IsCharmed(), IsPet(), m_CombatTimer, MAX_RUNES, RemoveUnitFlag(), ReplaceAllDynamicFlags(), SetImmuneToPC(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_DYNFLAG_TAPPED, UNIT_FLAG_IMMUNE_TO_PC, UNIT_FLAG_IN_COMBAT, and UNIT_STATE_ATTACK_PLAYER.

Referenced by CombatStop(), Player::LoadFromDB(), and Update().

◆ ClearInPetCombat()

◆ ClearUnitState()

void Unit::ClearUnitState ( uint32  f)
inline
692{ m_state &= ~f; }

References m_state.

Referenced by Spell::_cast(), HomeMovementGenerator< Creature >::_setTargetLocation(), Attack(), FollowerAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), AttackStop(), ClearInCombat(), boss_thorim::boss_thorimAI::DisableThorim(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), HomeMovementGenerator< Creature >::DoFinalize(), WaypointMovementGenerator< Creature >::DoFinalize(), RandomMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), RandomMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), Spell::EffectResurrectPet(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_ayamiss::EnterEvadeMode(), SmartAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), TimedFleeingMovementGenerator::Finalize(), RotateMovementGenerator::Finalize(), DistractMovementGenerator::Finalize(), AssistanceDistractMovementGenerator::Finalize(), Spell::finish(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraModSchoolImmunity(), debug_commandscript::HandleDebugUnitStateCommand(), AuraEffect::HandleFeignDeath(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), SmartAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), MotionMaster::MoveTargetedHome(), WaypointMovementGenerator< Creature >::OnArrived(), boss_nightbane::PathEndReached(), Creature::ReleaseFocus(), RemoveCharmedBy(), MotionTransport::RemovePassenger(), boss_ayamiss::Reset(), boss_hungarfen::Reset(), Player::ResetContestedPvP(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SetClientControl(), SetControlled(), Creature::setDeathState(), Player::setDeathState(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Player::SetIsSpectator(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), StopMoving(), StopMovingOnCurrentPos(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), and boss_the_lich_king::boss_the_lich_kingAI::UpdateAI().

◆ CombatStart()

void Unit::CombatStart ( Unit target,
bool  initialAggro = true 
)
13710{
13711 // Xinef: Dont allow to start combat with triggers
13712 if (victim->IsCreature() && victim->ToCreature()->IsTrigger())
13713 return;
13714
13715 if (initialAggro)
13716 {
13717 // Make player victim stand up automatically
13718 if (victim->getStandState() && victim->IsPlayer())
13719 {
13720 victim->SetStandState(UNIT_STAND_STATE_STAND);
13721 }
13722
13723 if (!victim->IsInCombat() && !victim->IsPlayer() && !victim->ToCreature()->HasReactState(REACT_PASSIVE) && victim->ToCreature()->IsAIEnabled)
13724 {
13725 if (victim->IsPet())
13726 victim->ToCreature()->AI()->AttackedBy(this); // PetAI has special handler before AttackStart()
13727 else
13728 {
13729 victim->ToCreature()->AI()->AttackStart(this);
13730 // if the target is an NPC with a pet or minion, pet should react.
13731 if (Unit* victimControlledUnit = victim->GetFirstControlled())
13732 {
13733 victimControlledUnit->SetInCombatWith(this);
13734 SetInCombatWith(victimControlledUnit);
13735 victimControlledUnit->AddThreat(this, 0.0f);
13736 }
13737 }
13738
13739 // if unit has an owner, put owner in combat.
13740 if (Unit* victimOwner = victim->GetOwner())
13741 {
13742 if (!(victimOwner->IsInCombatWith(this)))
13743 {
13744 /* warding off to not take over aggro for no reason
13745 Using only AddThreat causes delay in attack */
13746 if (!victimOwner->IsInCombat() && victimOwner->IsAIEnabled)
13747 {
13748 victimOwner->ToCreature()->AI()->AttackStart(this);
13749 }
13750 victimOwner->SetInCombatWith(this);
13751 SetInCombatWith(victimOwner);
13752 victimOwner->AddThreat(this, 0.0f);
13753 }
13754 }
13755 }
13756
13757 bool alreadyInCombat = IsInCombat();
13758
13759 SetInCombatWith(victim);
13760 victim->SetInCombatWith(this);
13761
13762 // Update leash timer when attacking creatures
13763 if (victim->IsCreature() && this != victim)
13764 victim->ToCreature()->UpdateLeashExtensionTime();
13765
13766 // Xinef: If pet started combat - put owner in combat
13767 if (!alreadyInCombat && IsInCombat())
13768 {
13769 if (Unit* owner = GetOwner())
13770 {
13771 owner->SetInCombatWith(victim);
13772 victim->SetInCombatWith(owner);
13773 }
13774 }
13775 }
13776
13777 Unit* who = victim->GetCharmerOrOwnerOrSelf();
13778 if (who->IsPlayer())
13779 SetContestedPvP(who->ToPlayer());
13780
13782 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13783 {
13784 player->UpdatePvP(true);
13786 }
13787}
@ AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT
Definition SpellDefines.h:66
@ UNIT_STAND_STATE_STAND
Definition UnitDefines.h:32
@ REACT_PASSIVE
Definition Unit.h:549
void UpdatePvP(bool state, bool _override=false)
Definition PlayerUpdates.cpp:1530
Unit * GetCharmerOrOwnerOrSelf() const
Definition Unit.h:1214
void SetContestedPvP(Player *attackedPlayer=nullptr, bool lookForNearContestedGuards=true)
Definition Unit.cpp:17320
Unit * GetFirstControlled() const
Definition Unit.cpp:11161

References Creature::AI(), CreatureAI::AttackedBy(), UnitAI::AttackStart(), AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetFirstControlled(), GetOwner(), getStandState(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), IsInCombat(), IsPet(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), REACT_PASSIVE, RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), SetStandState(), Object::ToCreature(), Object::ToPlayer(), UNIT_STAND_STATE_STAND, Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by AttackerStateUpdate(), Spell::CheckCast(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectTaunt(), and AssistDelayEvent::Execute().

◆ CombatStartOnCast()

void Unit::CombatStartOnCast ( Unit target,
bool  initialAggro = true,
uint32  duration = 0 
)
13790{
13791 // Xinef: Dont allow to start combat with triggers
13792 if (target->IsCreature() && target->ToCreature()->IsTrigger())
13793 return;
13794
13795 if (initialAggro)
13796 {
13797 SetInCombatWith(target, duration);
13798
13799 // Xinef: If pet started combat - put owner in combat
13800 if (Unit* owner = GetOwner())
13801 owner->SetInCombatWith(target, duration);
13802
13803 // Update leash timer when attacking creatures
13804 if (target->IsCreature())
13806 else if (ToCreature()) // Reset leash if it is a spell caster, else it may evade inbetween casts
13808 }
13809
13810 Unit* who = target->GetCharmerOrOwnerOrSelf();
13811 if (who->IsPlayer())
13812 SetContestedPvP(who->ToPlayer());
13813
13815 if (player && who->IsPvP() && (!who->IsPlayer() || !player->duel || player->duel->Opponent != who))
13816 {
13817 player->UpdatePvP(true);
13819 }
13820}
bool IsTrigger() const
Definition Creature.h:76

References AURA_INTERRUPT_FLAG_ENTER_PVP_COMBAT, Player::duel, GetCharmerOrOwnerOrSelf(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetOwner(), Object::IsCreature(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), RemoveAurasWithInterruptFlags(), SetContestedPvP(), SetInCombatWith(), Object::ToCreature(), Object::ToPlayer(), Creature::UpdateLeashExtensionTime(), and Player::UpdatePvP().

Referenced by Spell::_cast().

◆ CombatStop()

void Unit::CombatStop ( bool  includingCast = false)
10523{
10524 if (includingCast && IsNonMeleeSpellCast(false))
10526
10527 AttackStop();
10529 if (IsPlayer())
10530 ToPlayer()->SendAttackSwingCancelAttack(); // melee and ranged forced attack cancel
10531 if (Creature* pCreature = ToCreature())
10532 pCreature->ClearLastLeashExtensionTimePtr();
10533 ClearInCombat();
10534
10535 // xinef: just in case
10536 if (IsPetInCombat() && !IsPlayer())
10538}
void SendAttackSwingCancelAttack()
Definition PlayerMisc.cpp:140
bool IsPetInCombat() const
Definition Unit.h:882
void ClearInPetCombat()
Definition Unit.cpp:13934
void RemoveAllAttackers()
Remove all units in m_attackers list and send them AttackStop()
Definition Unit.cpp:10570
void ClearInCombat()
Definition Unit.cpp:13899
bool AttackStop()
Force the unit to stop attacking. This will clear UNIT_STATE_MELEE_ATTACKING, Interrupt current spell...
Definition Unit.cpp:10489

References AttackStop(), ClearInCombat(), ClearInPetCombat(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), IsPetInCombat(), Object::IsPlayer(), RemoveAllAttackers(), Player::SendAttackSwingCancelAttack(), Object::ToCreature(), and Object::ToPlayer().

Referenced by CreatureAI::_EnterEvadeMode(), PetAI::_stopAttack(), Player::ActivateTaxiPathTo(), CleanupBeforeRemoveFromMap(), CombatStopWithPets(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_kalecgos::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_maiev_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSanctuary(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), TotemAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), npc_pet_dk_ebon_gargoyle::FlyAway(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleCombatStopCommand(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), npc_commandscript::HandleNpcDeleteCommand(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_supremus_punch_invisible_stalker::IsSummonedBy(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SmartScript::ProcessAction(), Player::RemovePet(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), setDeathState(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), Player::TeleportTo(), Totem::UnSummon(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ CombatStopWithPets()

void Unit::CombatStopWithPets ( bool  includingCast = false)
10541{
10542 CombatStop(includingCast);
10543
10544 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10545 (*itr)->CombatStop(includingCast);
10546}

References CombatStop(), and m_Controlled.

Referenced by DealDamage(), WorldSession::HandleDuelCancelledOpcode(), Player::SetGameMaster(), Player::SetGMVisible(), and Player::UpdateArea().

◆ CountPctFromCurHealth()

uint32 Unit::CountPctFromCurHealth ( int32  pct) const
inline
1045{ return CalculatePct(GetHealth(), pct); }
uint32 GetHealth() const
Definition Unit.h:1031

References CalculatePct(), and GetHealth().

Referenced by spell_gen_leeching_swarm_aura::HandleEffectPeriodic().

◆ CountPctFromMaxHealth()

uint32 Unit::CountPctFromMaxHealth ( int32  pct) const
inline
1044{ return CalculatePct(GetMaxHealth(), pct); }
uint32 GetMaxHealth() const
Definition Unit.h:1032

References CalculatePct(), and GetMaxHealth().

Referenced by spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), spell_dru_survival_instincts_aura::AfterApply(), spell_dk_anti_magic_shell_self::CalculateAmount(), spell_dk_vampiric_blood::CalculateAmount(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::EffectHeal(), Spell::EffectHealPct(), Spell::EffectResurrect(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonType(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), spell_dk_death_strike::HandleDummy(), spell_hun_last_stand_pet::HandleDummy(), spell_warr_last_stand::HandleDummy(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), boss_harbinger_skyriss::JustSummoned(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Pet::LoadPetFromDB(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), and npc_injured_patient::npc_injured_patientAI::UpdateAI().

◆ CreateTamedPetFrom() [1/2]

Pet * Unit::CreateTamedPetFrom ( Creature creatureTarget,
uint32  spell_id = 0 
)
17424{
17425 if (!IsPlayer())
17426 return nullptr;
17427
17428 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17429
17430 if (!pet->CreateBaseAtCreature(creatureTarget))
17431 {
17432 delete pet;
17433 return nullptr;
17434 }
17435
17436 uint8 level = creatureTarget->GetLevel() + 5 < GetLevel() ? (GetLevel() - 5) : creatureTarget->GetLevel();
17437
17438 if (!InitTamedPet(pet, level, spell_id))
17439 {
17440 delete pet;
17441 return nullptr;
17442 }
17443
17444 return pet;
17445}
@ HUNTER_PET
Definition PetDefines.h:32
bool CreateBaseAtCreature(Creature *creature)
Definition Pet.cpp:941
bool InitTamedPet(Pet *pet, uint8 level, uint32 spell_id)
Definition Unit.cpp:17467

References Pet::CreateBaseAtCreature(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), and Object::ToPlayer().

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), and Spell::EffectTameCreature().

◆ CreateTamedPetFrom() [2/2]

Pet * Unit::CreateTamedPetFrom ( uint32  creatureEntry,
uint32  spell_id = 0 
)
17448{
17449 if (!IsPlayer())
17450 return nullptr;
17451
17452 CreatureTemplate const* creatureInfo = sObjectMgr->GetCreatureTemplate(creatureEntry);
17453 if (!creatureInfo)
17454 return nullptr;
17455
17456 Pet* pet = new Pet(ToPlayer(), HUNTER_PET);
17457
17458 if (!pet->CreateBaseAtCreatureInfo(creatureInfo, this) || !InitTamedPet(pet, GetLevel(), spell_id))
17459 {
17460 delete pet;
17461 return nullptr;
17462 }
17463
17464 return pet;
17465}
#define sObjectMgr
Definition ObjectMgr.h:1650
bool CreateBaseAtCreatureInfo(CreatureTemplate const *cinfo, Unit *owner)
Definition Pet.cpp:976
Definition CreatureData.h:186

References Pet::CreateBaseAtCreatureInfo(), GetLevel(), HUNTER_PET, InitTamedPet(), Object::IsPlayer(), sObjectMgr, and Object::ToPlayer().

◆ CreateVehicleKit()

bool Unit::CreateVehicleKit ( uint32  id,
uint32  creatureEntry 
)

Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)

18802{
18803 VehicleEntry const* vehInfo = sVehicleStore.LookupEntry(id);
18804 if (!vehInfo)
18805 return false;
18806
18807 m_vehicleKit = new Vehicle(this, vehInfo, creatureEntry);
18810 return true;
18811}
DBCStorage< VehicleEntry > sVehicleStore(VehicleEntryfmt)
@ UNIT_MASK_VEHICLE
Definition UnitDefines.h:161
@ UPDATEFLAG_VEHICLE
Definition UpdateData.h:46

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, sVehicleStore, UNIT_MASK_VEHICLE, and UPDATEFLAG_VEHICLE.

Referenced by Creature::CreateFromProto(), AuraEffect::HandleAuraSetVehicle(), Mount(), and npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit().

◆ DealDamage()

uint32 Unit::DealDamage ( Unit attacker,
Unit victim,
uint32  damage,
CleanDamage const *  cleanDamage = nullptr,
DamageEffectType  damagetype = DIRECT_DAMAGE,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL,
SpellInfo const *  spellProto = nullptr,
bool  durabilityLoss = true,
bool  allowGM = false,
Spell const *  spell = nullptr 
)
static

@fix: Hack to avoid premature leashing

825{
826 damage = sScriptMgr->DealDamage(attacker, victim, damage, damagetype);
827 // Xinef: initialize damage done for rage calculations
828 // Xinef: its rare to modify damage in hooks, however training dummy's sets damage to 0
829 uint32 rage_damage = damage + ((cleanDamage != nullptr) ? cleanDamage->absorbed_damage : 0);
830
831 //if (attacker)
832 {
833 if (victim->IsAIEnabled)
834 victim->GetAI()->DamageTaken(attacker, damage, damagetype, damageSchoolMask);
835
836 if (attacker && attacker->IsAIEnabled)
837 attacker->GetAI()->DamageDealt(victim, damage, damagetype, damageSchoolMask);
838 }
839
840 // Hook for OnDamage Event
841 sScriptMgr->OnDamage(attacker, victim, damage);
842
843 if (victim->IsPlayer() && attacker != victim)
844 {
845 // Signal to pets that their owner was attacked
846 Pet* pet = victim->ToPlayer()->GetPet();
847
848 if (pet && pet->IsAlive())
849 pet->AI()->OwnerAttackedBy(attacker);
850 }
851
852 //Dont deal damage to unit if .cheat god is enable.
853 if (victim->IsPlayer())
854 {
855 if (victim->ToPlayer()->GetCommandStatus(CHEAT_GOD))
856 {
857 return 0;
858 }
859 }
860
861 // Signal the pet it was attacked so the AI can respond if needed
862 if (victim->IsCreature() && attacker != victim && victim->IsPet() && victim->IsAlive())
863 victim->ToPet()->AI()->AttackedBy(attacker);
864
865 if (damagetype != NODAMAGE)
866 {
867 // interrupting auras with AURA_INTERRUPT_FLAG_DAMAGE before checking !damage (absorbed damage breaks that type of auras)
868 if (spellProto)
869 {
870 if (!spellProto->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
872 }
873 else
875
876 // interrupt spells with SPELL_INTERRUPT_FLAG_ABORT_ON_DMG on absorbed damage (no dots)
877 if (!damage && damagetype != DOT && cleanDamage && cleanDamage->absorbed_damage)
878 {
879 if (victim != attacker && victim->IsPlayer())
880 {
881 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
882 {
883 if (spell->getState() == SPELL_STATE_PREPARING)
884 {
885 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
886 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
887 {
888 victim->InterruptNonMeleeSpells(false);
889 }
890 }
891 }
892 }
893 }
894
895 // We're going to call functions which can modify content of the list during iteration over it's elements
896 // Let's copy the list so we can prevent iterator invalidation
898 // copy damage to casters of this aura
899 for (AuraEffectList::iterator i = vCopyDamageCopy.begin(); i != vCopyDamageCopy.end(); ++i)
900 {
901 // Check if aura was removed during iteration - we don't need to work on such auras
902 if (!((*i)->GetBase()->IsAppliedOnTarget(victim->GetGUID())))
903 continue;
904 // check damage school mask
905 if (((*i)->GetMiscValue() & damageSchoolMask) == 0)
906 continue;
907
908 Unit* shareDamageTarget = (*i)->GetCaster();
909 if (!shareDamageTarget)
910 continue;
911 SpellInfo const* spell = (*i)->GetSpellInfo();
912
913 uint32 shareDamage = CalculatePct(damage, (*i)->GetAmount());
914
915 uint32 shareAbsorb = 0;
916 uint32 shareResist = 0;
917
918 if (shareDamageTarget->IsImmunedToDamageOrSchool(damageSchoolMask))
919 {
920 shareAbsorb = shareDamage;
921 shareDamage = 0;
922 }
923 else
924 {
925 DamageInfo sharedDamageInfo(attacker, shareDamageTarget, shareDamage, spellProto, damageSchoolMask, damagetype);
926 Unit::CalcAbsorbResist(sharedDamageInfo, true);
927 shareAbsorb = sharedDamageInfo.GetAbsorb();
928 shareResist = sharedDamageInfo.GetResist();
929 shareDamage = sharedDamageInfo.GetDamage();
930 Unit::DealDamageMods(shareDamageTarget, shareDamage, &shareAbsorb);
931 }
932
933 if (attacker && shareDamageTarget->IsPlayer())
934 {
935 attacker->SendSpellNonMeleeDamageLog(shareDamageTarget, spell, shareDamage, damageSchoolMask, shareAbsorb, shareResist, damagetype == DIRECT_DAMAGE, 0, false, true);
936 }
937
938 Unit::DealDamage(attacker, shareDamageTarget, shareDamage, cleanDamage, NODAMAGE, damageSchoolMask, spellProto, false, false, damageSpell);
939 }
940 }
941
942 // Rage from Damage made (only from direct weapon damage)
943 if (attacker && cleanDamage && damagetype == DIRECT_DAMAGE && attacker != victim && attacker->HasActivePowerType(POWER_RAGE))
944 {
945 uint32 weaponSpeedHitFactor;
946
947 switch (cleanDamage->attackType)
948 {
949 case BASE_ATTACK:
950 case OFF_ATTACK:
951 {
952 weaponSpeedHitFactor = uint32(attacker->GetAttackTime(cleanDamage->attackType) / 1000.0f * (cleanDamage->attackType == BASE_ATTACK ? 3.5f : 1.75f));
953 if (cleanDamage->hitOutCome == MELEE_HIT_CRIT)
954 weaponSpeedHitFactor *= 2;
955
956 attacker->RewardRage(rage_damage, weaponSpeedHitFactor, true);
957 break;
958 }
959 case RANGED_ATTACK:
960 break;
961 default:
962 break;
963 }
964 }
965
966 if (!damage)
967 {
968 // Rage from absorbed damage
969 if (cleanDamage && cleanDamage->absorbed_damage)
970 {
971 if (victim->HasActivePowerType(POWER_RAGE))
972 victim->RewardRage(cleanDamage->absorbed_damage, 0, false);
973
974 if (attacker && attacker->HasActivePowerType(POWER_RAGE))
975 attacker->RewardRage(cleanDamage->absorbed_damage, 0, true);
976 }
977
978 return 0;
979 }
980
981 LOG_DEBUG("entities.unit", "DealDamageStart");
982
983 uint32 health = victim->GetHealth();
984 LOG_DEBUG("entities.unit", "deal dmg:{} to health:{} ", damage, health);
985
986 // duel ends when player has 1 or less hp
987 bool duel_hasEnded = false;
988 bool duel_wasMounted = false;
989 if (victim->IsPlayer() && victim->ToPlayer()->duel && damage >= (health - 1))
990 {
991 // xinef: situation not possible earlier, just return silently.
992 if (!attacker)
993 return 0;
994
995 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
996 if (victim->ToPlayer()->duel->Opponent == attacker || victim->ToPlayer()->duel->Opponent->GetGUID() == attacker->GetOwnerGUID())
997 damage = health - 1;
998
999 duel_hasEnded = true;
1000 }
1001 else if (victim->IsVehicle() && damage >= (health - 1) && victim->GetCharmer() && victim->GetCharmer()->IsPlayer())
1002 {
1003 Player* victimRider = victim->GetCharmer()->ToPlayer();
1004
1005 if (victimRider && victimRider->duel && victimRider->duel->IsMounted)
1006 {
1007 // xinef: situation not possible earlier, just return silently.
1008 if (!attacker)
1009 return 0;
1010
1011 // prevent kill only if killed in duel and killed by opponent or opponent controlled creature
1012 if (victimRider->duel->Opponent == attacker || victimRider->duel->Opponent->GetGUID() == attacker->GetCharmerGUID())
1013 damage = health - 1;
1014
1015 duel_wasMounted = true;
1016 duel_hasEnded = true;
1017 }
1018 }
1019
1020 if (attacker && attacker != victim)
1021 if (Player* killer = attacker->GetCharmerOrOwnerPlayerOrPlayerItself())
1022 {
1023 // pussywizard: don't allow GMs to deal damage in normal way (this leaves no evidence in logs!), they have commands to do so
1024 //if (!allowGM && killer->GetSession()->GetSecurity() && killer->GetSession()->GetSecurity() <= SEC_ADMINISTRATOR)
1025 // return 0;
1026
1027 if (Battleground* bg = killer->GetBattleground())
1028 {
1029 bg->UpdatePlayerScore(killer, SCORE_DAMAGE_DONE, damage);
1030 killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, damage, 0, victim); // pussywizard: InBattleground() optimization
1031 }
1032 //killer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_DEALT, damage); // pussywizard: optimization
1033 }
1034
1035 if (victim->IsPlayer())
1036 ;//victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HIT_RECEIVED, damage); // pussywizard: optimization
1037 else if (!victim->IsControlledByPlayer() || victim->IsVehicle())
1038 {
1039 if (!victim->ToCreature()->hasLootRecipient())
1040 victim->ToCreature()->SetLootRecipient(attacker);
1041
1042 if (!attacker || attacker->IsControlledByPlayer() || attacker->IsCreatedByPlayer())
1043 {
1044 uint32 unDamage = health < damage ? health : damage;
1045 bool damagedByPlayer = unDamage && attacker && (attacker->IsPlayer() || attacker->m_movedByPlayer != nullptr);
1046 victim->ToCreature()->LowerPlayerDamageReq(unDamage, damagedByPlayer);
1047 }
1048 }
1049
1050 // Sparring
1051 if (victim->CanSparringWith(attacker))
1052 {
1053 if (damage >= victim->GetHealth())
1054 damage = 0;
1055
1056 uint32 sparringHealth = victim->GetHealth() * (victim->ToCreature()->GetSparringPct() / 100);
1057 if (victim->GetHealth() - damage <= sparringHealth)
1058 damage = 0;
1059 }
1060
1061 if (health <= damage)
1062 {
1063 LOG_DEBUG("entities.unit", "DealDamage: victim just died");
1064
1065 //if (attacker && victim->IsPlayer() && victim != attacker)
1066 //victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, health); // pussywizard: optimization
1067 Unit::Kill(attacker, victim, durabilityLoss, cleanDamage ? cleanDamage->attackType : BASE_ATTACK, spellProto, damageSpell);
1068 }
1069 else
1070 {
1071 LOG_DEBUG("entities.unit", "DealDamageAlive");
1072
1073 //if (victim->IsPlayer())
1074 // victim->ToPlayer()->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_DAMAGE_RECEIVED, damage); // pussywizard: optimization
1075
1076 victim->ModifyHealth(- (int32)damage);
1077
1078 if (damagetype == DIRECT_DAMAGE || damagetype == SPELL_DIRECT_DAMAGE)
1079 victim->RemoveAurasWithInterruptFlags(AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, spellProto ? spellProto->Id : 0);
1080
1081 if (!victim->IsPlayer())
1082 {
1084 if (damagetype != DOT && damage > 0 && !victim->GetOwnerGUID().IsPlayer() && (!spellProto || !spellProto->HasAura(SPELL_AURA_DAMAGE_SHIELD)))
1086
1087 if (attacker)
1088 {
1089 if (spellProto && victim->CanHaveThreatList() && !victim->HasUnitState(UNIT_STATE_EVADE) && !victim->IsInCombatWith(attacker))
1090 {
1091 victim->CombatStart(attacker, !(spellProto->AttributesEx3 & SPELL_ATTR3_SUPPRESS_TARGET_PROCS));
1092 }
1093
1094 victim->AddThreat(attacker, float(damage), damageSchoolMask, spellProto);
1095 }
1096 }
1097 else // victim is a player
1098 {
1099 // random durability for items (HIT TAKEN)
1101 {
1104 }
1105 }
1106
1107 // Rage from damage received
1108 if (attacker != victim && victim->HasActivePowerType(POWER_RAGE))
1109 {
1110 uint32 rageDamage = damage + (cleanDamage ? cleanDamage->absorbed_damage : 0);
1111 victim->RewardRage(rageDamage, 0, false);
1112 }
1113
1114 if (attacker && attacker->IsPlayer())
1115 {
1116 // random durability for items (HIT DONE)
1118 {
1120 attacker->ToPlayer()->DurabilityPointLossForEquipSlot(slot);
1121 }
1122 }
1123
1124 if (damagetype != NODAMAGE && damage && (!spellProto || !(spellProto->HasAttribute(SPELL_ATTR3_TREAT_AS_PERIODIC) || spellProto->HasAttribute(SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK))))
1125 {
1126 if (victim != attacker && victim->IsPlayer()) // does not support creature push_back
1127 {
1128 if (damagetype != DOT && !(damageSpell && damageSpell->m_targets.HasDstChannel()))
1129 {
1130 if (Spell* spell = victim->m_currentSpells[CURRENT_GENERIC_SPELL])
1131 {
1132 if (spell->getState() == SPELL_STATE_PREPARING)
1133 {
1134 uint32 interruptFlags = spell->m_spellInfo->InterruptFlags;
1135 if (interruptFlags & SPELL_INTERRUPT_FLAG_ABORT_ON_DMG)
1136 {
1137 victim->InterruptNonMeleeSpells(false);
1138 }
1139 else if (interruptFlags & SPELL_INTERRUPT_FLAG_PUSH_BACK)
1140 {
1141 spell->Delayed();
1142 }
1143 }
1144 }
1145
1146 if (Spell* spell = victim->m_currentSpells[CURRENT_CHANNELED_SPELL])
1147 if (spell->getState() == SPELL_STATE_CASTING)
1148 {
1149 if ((spell->m_spellInfo->ChannelInterruptFlags & CHANNEL_FLAG_DELAY) != 0)
1150 {
1151 spell->DelayedChannel();
1152 }
1153 }
1154 }
1155 }
1156 }
1157
1158 // last damage from duel opponent
1159 if (duel_hasEnded)
1160 {
1161 Player* he = duel_wasMounted ? victim->GetCharmer()->ToPlayer() : victim->ToPlayer();
1162
1163 ASSERT_NODEBUGINFO(he && he->duel);
1164
1165 if (duel_wasMounted) // In this case victim==mount
1166 victim->SetHealth(1);
1167 else
1168 he->SetHealth(1);
1169
1170 he->duel->Opponent->CombatStopWithPets(true);
1171 he->CombatStopWithPets(true);
1172
1173 he->CastSpell(he, 7267, true); // beg
1175 }
1176 }
1177
1178 LOG_DEBUG("entities.unit", "DealDamageEnd returned {} damage", damage);
1179
1180 return damage;
1181}
@ SCORE_DAMAGE_DONE
Definition BattlegroundScore.h:32
@ ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE
Definition DBCEnums.h:130
#define ASSERT_NODEBUGINFO
Definition Errors.h:69
@ CHEAT_GOD
Definition Player.h:1006
EquipmentSlots
Definition Player.h:680
@ EQUIPMENT_SLOT_END
Definition Player.h:701
bool roll_chance_f(float chance)
Definition Random.h:57
@ POWER_RAGE
Definition SharedDefines.h:270
@ SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK
Definition SharedDefines.h:647
@ SPELL_ATTR3_TREAT_AS_PERIODIC
Definition SharedDefines.h:518
@ SPELL_ATTR3_SUPPRESS_TARGET_PROCS
Definition SharedDefines.h:510
@ DUEL_WON
Definition SharedDefines.h:3868
@ SPELL_ATTR4_REACTIVE_DAMAGE_PROC
Definition SharedDefines.h:544
@ SPELL_AURA_DAMAGE_SHIELD
Definition SpellAuraDefines.h:78
@ SPELL_AURA_SHARE_DAMAGE_PCT
Definition SpellAuraDefines.h:363
@ CHANNEL_FLAG_DELAY
Definition SpellDefines.h:38
@ AURA_INTERRUPT_FLAG_TAKE_DAMAGE
Definition SpellDefines.h:44
@ AURA_INTERRUPT_FLAG_DIRECT_DAMAGE
Definition SpellDefines.h:67
@ SPELL_INTERRUPT_FLAG_ABORT_ON_DMG
Definition SpellDefines.h:30
@ SPELL_INTERRUPT_FLAG_PUSH_BACK
Definition SpellDefines.h:27
@ SPELL_STATE_PREPARING
Definition Spell.h:227
@ SPELL_STATE_CASTING
Definition Spell.h:228
@ NODAMAGE
Definition Unit.h:253
@ CURRENT_CHANNELED_SPELL
Definition Unit.h:540
@ CURRENT_GENERIC_SPELL
Definition Unit.h:539
@ RATE_DURABILITY_LOSS_DAMAGE
Definition WorldConfig.h:468
virtual void OwnerAttackedBy(Unit *)
Definition CreatureAI.h:173
virtual void AttackedBy(Unit *)
Definition CreatureAI.h:150
void SetLootRecipient(Unit *unit, bool withGroup=true)
Definition Creature.cpp:1331
bool hasLootRecipient() const
Definition Creature.h:235
float GetSparringPct() const
Definition Creature.h:192
void LowerPlayerDamageReq(uint32 unDamage, bool damagedByPlayer=true)
Definition Creature.cpp:3833
bool IsPlayer() const
Definition ObjectGuid.h:168
void UpdateAchievementCriteria(AchievementCriteriaTypes type, uint32 miscValue1=0, uint32 miscValue2=0, Unit *unit=nullptr)
Definition PlayerUpdates.cpp:2179
void DurabilityPointLossForEquipSlot(EquipmentSlots slot)
Definition Player.cpp:4845
Pet * GetPet() const
Definition Player.cpp:8938
bool GetCommandStatus(uint32 command) const
Definition Player.h:1200
uint32 ChannelInterruptFlags
Definition SpellInfo.h:354
uint32 InterruptFlags
Definition SpellInfo.h:352
virtual void DamageDealt(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage to any victim (before damage apply)
Definition UnitAI.h:361
virtual void DamageTaken(Unit *, uint32 &, DamageEffectType, SpellSchoolMask)
Called at any Damage from any attacker (before damage apply)
Definition UnitAI.h:368
int32 ModifyHealth(int32 val)
Definition Unit.cpp:14181
Pet * ToPet()
Definition Unit.h:684
bool IsCreatedByPlayer() const
Definition Unit.h:1235
Unit * GetCharmer() const
Definition Unit.cpp:10694
static void Kill(Unit *killer, Unit *victim, bool durabilityLoss=true, WeaponAttackType attackType=BASE_ATTACK, SpellInfo const *spellProto=nullptr, Spell const *spell=nullptr)
Definition Unit.cpp:17788
void RewardRage(uint32 damage, uint32 weaponSpeedHitFactor, bool attacker)
Definition Unit.cpp:19955
void SetHealth(uint32 val)
Definition Unit.cpp:15568
ObjectGuid GetCharmerGUID() const
Definition Unit.h:674
virtual bool HasActivePowerType(Powers power)
Definition Unit.h:1055
void CombatStopWithPets(bool includingCast=false)
Definition Unit.cpp:10540

References CleanDamage::absorbed_damage, ACHIEVEMENT_CRITERIA_TYPE_DAMAGE_DONE, AddThreat(), Creature::AI(), ASSERT_NODEBUGINFO, CreatureAI::AttackedBy(), CleanDamage::attackType, SpellInfo::AttributesEx3, AURA_INTERRUPT_FLAG_DIRECT_DAMAGE, AURA_INTERRUPT_FLAG_TAKE_DAMAGE, BASE_ATTACK, CalcAbsorbResist(), CalculatePct(), CanHaveThreatList(), CanSparringWith(), CastSpell(), CHANNEL_FLAG_DELAY, CHEAT_GOD, CombatStart(), CombatStopWithPets(), CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, UnitAI::DamageDealt(), UnitAI::DamageTaken(), DealDamage(), DealDamageMods(), DIRECT_DAMAGE, DOT, Player::duel, DUEL_WON, Player::DuelComplete(), Player::DurabilityPointLossForEquipSlot(), EQUIPMENT_SLOT_END, DamageInfo::GetAbsorb(), GetAI(), GetAttackTime(), GetAuraEffectsByType(), GetCharmer(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), Player::GetCommandStatus(), DamageInfo::GetDamage(), Object::GetGUID(), GetHealth(), GetOwnerGUID(), Player::GetPet(), DamageInfo::GetResist(), Creature::GetSparringPct(), HasActivePowerType(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellCastTargets::HasDstChannel(), Creature::hasLootRecipient(), HasUnitState(), CleanDamage::hitOutCome, SpellInfo::Id, InterruptNonMeleeSpells(), IsAIEnabled, IsAlive(), IsControlledByPlayer(), IsCreatedByPlayer(), Object::IsCreature(), IsImmunedToDamageOrSchool(), IsInCombatWith(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), IsVehicle(), Kill(), LOG_DEBUG, Creature::LowerPlayerDamageReq(), m_currentSpells, m_movedByPlayer, Spell::m_targets, MELEE_HIT_CRIT, ModifyHealth(), NODAMAGE, OFF_ATTACK, CreatureAI::OwnerAttackedBy(), POWER_RAGE, RANGED_ATTACK, RATE_DURABILITY_LOSS_DAMAGE, RemoveAurasWithInterruptFlags(), RewardRage(), roll_chance_f(), SCORE_DAMAGE_DONE, SendSpellNonMeleeDamageLog(), SetHealth(), Creature::SetLootRecipient(), SPELL_ATTR3_SUPPRESS_TARGET_PROCS, SPELL_ATTR3_TREAT_AS_PERIODIC, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR7_DONT_CAUSE_SPELL_PUSHBACK, SPELL_AURA_DAMAGE_SHIELD, SPELL_AURA_SHARE_DAMAGE_PCT, SPELL_DIRECT_DAMAGE, SPELL_INTERRUPT_FLAG_ABORT_ON_DMG, SPELL_INTERRUPT_FLAG_PUSH_BACK, SPELL_STATE_CASTING, SPELL_STATE_PREPARING, sScriptMgr, sWorld, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_STATE_EVADE, Player::UpdateAchievementCriteria(), Creature::UpdateLeashExtensionTime(), and urand().

Referenced by CalcAbsorbResist(), DealDamage(), DealMeleeDamage(), DealSpellDamage(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectInstaKill(), Player::EnvironmentalDamage(), spell_mt_phoenix_burn::HandleAfterCast(), spell_alar_ember_blast::HandleCast(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), spell_svala_ritual_strike::HandleDummyEffect(), spell_valkyr_touch_aura::HandleEffectPeriodic(), spell_lady_vashj_magic_barrier::HandleEffectRemove(), spell_algalon_collapse_aura::HandlePeriodic(), spell_kaelthas_burn::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_gluth_decimate::HandleScriptEffect(), npc_necrotic_shard::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ DealDamageMods()

void Unit::DealDamageMods ( Unit const *  victim,
uint32 damage,
uint32 absorb 
)
static

◆ DealHeal()

int32 Unit::DealHeal ( Unit healer,
Unit victim,
uint32  addhealth 
)
static
11038{
11039 int32 gain = 0;
11040
11041 if (healer)
11042 {
11043 if (victim->IsAIEnabled)
11044 victim->GetAI()->HealReceived(healer, addhealth);
11045
11046 if (healer->IsAIEnabled)
11047 healer->GetAI()->HealDone(victim, addhealth);
11048 }
11049
11050 if (addhealth)
11051 gain = victim->ModifyHealth(int32(addhealth));
11052
11053 // Hook for OnHeal Event
11054 sScriptMgr->OnHeal(healer, victim, (uint32&)gain);
11055
11056 Unit* unit = healer;
11057
11058 if (healer && healer->IsCreature() && healer->ToCreature()->IsTotem())
11059 unit = healer->GetOwner();
11060
11061 if (!unit)
11062 return gain;
11063
11064 if (Player* player = unit->ToPlayer())
11065 {
11066 if (Battleground* bg = player->GetBattleground())
11067 bg->UpdatePlayerScore(player, SCORE_HEALING_DONE, gain);
11068
11069 // use the actual gain, as the overheal shall not be counted, skip gain 0 (it ignored anyway in to criteria)
11070 if (gain && player->InBattleground()) // pussywizard: InBattleground() optimization
11071 player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, gain, 0, victim);
11072
11073 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEAL_CASTED, addhealth); // pussywizard: optimization
11074 }
11075
11076 /*if (Player* player = victim->ToPlayer())
11077 {
11078 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_TOTAL_HEALING_RECEIVED, gain); // pussywizard: optimization
11079 //player->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_HIGHEST_HEALING_RECEIVED, addhealth); // pussywizard: optimization
11080 }*/
11081
11082 return gain;
11083}
@ SCORE_HEALING_DONE
Definition BattlegroundScore.h:33
@ ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE
Definition DBCEnums.h:169
virtual void HealReceived(Unit *, uint32 &)
Called when the creature receives heal.
Definition UnitAI.h:371
virtual void HealDone(Unit *, uint32 &)
Called when the unit heals.
Definition UnitAI.h:377

References ACHIEVEMENT_CRITERIA_TYPE_HEALING_DONE, GetAI(), GetOwner(), UnitAI::HealDone(), UnitAI::HealReceived(), IsAIEnabled, Object::IsCreature(), IsTotem(), ModifyHealth(), SCORE_HEALING_DONE, sScriptMgr, Object::ToCreature(), and Object::ToPlayer().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), HealBySpell(), and npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI().

◆ DealMeleeDamage()

void Unit::DealMeleeDamage ( CalcDamageInfo damageInfo,
bool  durabilityLoss 
)
Todo:
: Move this to a packet handler
1856{
1857 Unit* victim = damageInfo->target;
1858
1859 auto canTakeMeleeDamage = [&]()
1860 {
1861 return victim->IsAlive() && !victim->HasUnitState(UNIT_STATE_IN_FLIGHT) && (!victim->IsCreature() || !victim->ToCreature()->IsEvadingAttacks());
1862 };
1863
1864 if (!canTakeMeleeDamage())
1865 {
1866 return;
1867 }
1868
1869 // Hmmmm dont like this emotes client must by self do all animations
1870 if (damageInfo->HitInfo & HITINFO_CRITICALHIT)
1872 if (damageInfo->blocked_amount && damageInfo->TargetState != VICTIMSTATE_BLOCKS)
1874
1875 // Parry haste is enabled if it's not a creature or if the creature doesn't have the NO_PARRY_HASTEN flag.
1876 bool isParryHasteEnabled = !victim->IsCreature() ||
1878 if (damageInfo->TargetState == VICTIMSTATE_PARRY && isParryHasteEnabled)
1879 {
1880 // Get attack timers
1881 float offtime = float(victim->getAttackTimer(OFF_ATTACK));
1882 float basetime = float(victim->getAttackTimer(BASE_ATTACK));
1883 // Reduce attack time
1884 if (victim->HasOffhandWeaponForAttack() && offtime < basetime)
1885 {
1886 float percent20 = victim->GetAttackTime(OFF_ATTACK) * 0.20f;
1887 float percent60 = 3.0f * percent20;
1888 if (offtime > percent20 && offtime <= percent60)
1889 victim->setAttackTimer(OFF_ATTACK, uint32(percent20));
1890 else if (offtime > percent60)
1891 {
1892 offtime -= 2.0f * percent20;
1893 victim->setAttackTimer(OFF_ATTACK, uint32(offtime));
1894 }
1895 }
1896 else
1897 {
1898 float percent20 = victim->GetAttackTime(BASE_ATTACK) * 0.20f;
1899 float percent60 = 3.0f * percent20;
1900 if (basetime > percent20 && basetime <= percent60)
1901 victim->setAttackTimer(BASE_ATTACK, uint32(percent20));
1902 else if (basetime > percent60)
1903 {
1904 basetime -= 2.0f * percent20;
1905 victim->setAttackTimer(BASE_ATTACK, uint32(basetime));
1906 }
1907 }
1908 }
1909
1910 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
1911 {
1912 if (!canTakeMeleeDamage() || (!damageInfo->damages[i].damage && !damageInfo->damages[i].absorb && !damageInfo->damages[i].resist))
1913 {
1914 continue;
1915 }
1916
1917 // Call default DealDamage
1918 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->damages[i].absorb, damageInfo->attackType, damageInfo->hitOutCome);
1919 Unit::DealDamage(this, victim, damageInfo->damages[i].damage, &cleanDamage, DIRECT_DAMAGE, SpellSchoolMask(damageInfo->damages[i].damageSchoolMask), nullptr, durabilityLoss);
1920 }
1921
1922 // gain rage if attack is fully blocked, dodged or parried
1924 {
1925 switch (damageInfo->attackType)
1926 {
1927 case BASE_ATTACK:
1928 case OFF_ATTACK:
1929 {
1930 uint32 weaponSpeedHitFactor = uint32(GetAttackTime(damageInfo->attackType) / 1000.0f * (damageInfo->attackType == BASE_ATTACK ? 3.5f : 1.75f));
1931 RewardRage(damageInfo->cleanDamage, weaponSpeedHitFactor, true);
1932 break;
1933 }
1934 default:
1935 break;
1936 }
1937 }
1938
1939 // If this is a creature and it attacks from behind it has a probability to daze it's victim
1940 if ((damageInfo->damages[0].damage + damageInfo->damages[1].damage) && ((damageInfo->hitOutCome == MELEE_HIT_CRIT || damageInfo->hitOutCome == MELEE_HIT_CRUSHING || damageInfo->hitOutCome == MELEE_HIT_NORMAL || damageInfo->hitOutCome == MELEE_HIT_GLANCING) &&
1941 !IsPlayer() && !ToCreature()->IsControlledByPlayer() && !victim->HasInArc(M_PI, this)
1942 && (victim->IsPlayer() || !victim->ToCreature()->isWorldBoss()) && !victim->IsVehicle()))
1943 {
1944 // -probability is between 0% and 40%
1945 // 20% base chance
1946 float Probability = 20.0f;
1947
1948 // there is a newbie protection, at level 10 just 7% base chance; assuming linear function
1949 if (victim->GetLevel() < 30)
1950 Probability = 0.65f * victim->GetLevel() + 0.5f;
1951
1952 uint32 VictimDefense = victim->GetDefenseSkillValue();
1953 uint32 AttackerMeleeSkill = GetUnitMeleeSkill();
1954
1955 // xinef: fix daze mechanics
1956 Probability -= ((float)VictimDefense - AttackerMeleeSkill) * 0.1428f;
1957
1958 if (Probability > 40.0f)
1959 Probability = 40.0f;
1960
1961 // Daze application
1962 if (sWorld->getBoolConfig(CONFIG_ENABLE_DAZE))
1963 if (roll_chance_f(std::max(0.0f, Probability)))
1964 CastSpell(victim, 1604, true);
1965 }
1966
1967 if (IsPlayer())
1968 ToPlayer()->CastItemCombatSpell(victim, damageInfo->attackType, damageInfo->procVictim, damageInfo->procEx);
1969
1970 // Do effect if any damage done to target
1971 if (damageInfo->damages[0].damage + damageInfo->damages[1].damage)
1972 {
1973 // We're going to call functions which can modify content of the list during iteration over it's elements
1974 // Let's copy the list so we can prevent iterator invalidation
1976 for (AuraEffectList::const_iterator dmgShieldItr = vDamageShieldsCopy.begin(); dmgShieldItr != vDamageShieldsCopy.end(); ++dmgShieldItr)
1977 {
1978 SpellInfo const* i_spellProto = (*dmgShieldItr)->GetSpellInfo();
1979 // Damage shield can be resisted...
1980 if (SpellMissInfo missInfo = victim->SpellHitResult(this, i_spellProto, false))
1981 {
1982 victim->SendSpellMiss(this, i_spellProto->Id, missInfo);
1983 continue;
1984 }
1985
1986 // ...or immuned
1987 if (IsImmunedToDamageOrSchool(i_spellProto))
1988 {
1989 victim->SendSpellDamageImmune(this, i_spellProto->Id);
1990 continue;
1991 }
1992
1993 uint32 damage = uint32(std::max(0, (*dmgShieldItr)->GetAmount())); // xinef: done calculated at amount calculation
1994
1995 if (Unit* caster = (*dmgShieldItr)->GetCaster())
1996 {
1997 damage = caster->SpellDamageBonusDone(this, i_spellProto, damage, SPELL_DIRECT_DAMAGE, (*dmgShieldItr)->GetEffIndex());
1998 damage = this->SpellDamageBonusTaken(caster, i_spellProto, damage, SPELL_DIRECT_DAMAGE);
1999 }
2000
2001 uint32 absorb = 0;
2002
2003 DamageInfo dmgInfo(victim, this, damage, i_spellProto, i_spellProto->GetSchoolMask(), SPELL_DIRECT_DAMAGE);
2004 Unit::CalcAbsorbResist(dmgInfo);
2005 absorb = dmgInfo.GetAbsorb();
2006 damage = dmgInfo.GetDamage();
2007
2008 Unit::DealDamageMods(this, damage, &absorb);
2009
2011 WorldPacket data(SMSG_SPELLDAMAGESHIELD, (8 + 8 + 4 + 4 + 4 + 4));
2012 data << victim->GetGUID();
2013 data << GetGUID();
2014 data << uint32(i_spellProto->Id);
2015 data << uint32(damage); // Damage
2016 int32 overkill = int32(damage) - int32(GetHealth());
2017 data << uint32(overkill > 0 ? overkill : 0); // Overkill
2018 data << uint32(i_spellProto->GetSchoolMask());
2019 victim->SendMessageToSet(&data, true);
2020
2021 Unit::DealDamage(victim, this, damage, 0, SPELL_DIRECT_DAMAGE, i_spellProto->GetSchoolMask(), i_spellProto, true);
2022 }
2023 }
2024}
@ CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN
Definition CreatureData.h:48
@ EMOTE_ONESHOT_WOUND_CRITICAL
Definition SharedDefines.h:1924
@ EMOTE_ONESHOT_PARRY_SHIELD
Definition SharedDefines.h:1930
SpellMissInfo
Definition SharedDefines.h:1518
@ CONFIG_ENABLE_DAZE
Definition WorldConfig.h:142
bool isWorldBoss() const
Definition Creature.h:121
void CastItemCombatSpell(Unit *target, WeaponAttackType attType, uint32 procVictim, uint32 procEx)
Definition Player.cpp:7218
SpellSchoolMask GetSchoolMask() const
Definition SpellInfo.cpp:1998
uint32 GetUnitMeleeSkill(Unit const *target=nullptr) const
Definition Unit.h:1114
void SendSpellMiss(Unit *target, uint32 spellID, SpellMissInfo missInfo)
Definition Unit.cpp:6532
uint32 GetDefenseSkillValue(Unit const *target=nullptr) const
Definition Unit.cpp:3653
void SendSpellDamageImmune(Unit *target, uint32 spellId)
Definition Unit.cpp:6556
SpellMissInfo SpellHitResult(Unit *victim, SpellInfo const *spell, bool canReflect=false)
Definition Unit.cpp:3498
uint32 SpellDamageBonusTaken(Unit *caster, SpellInfo const *spellProto, uint32 pdamage, DamageEffectType damagetype, uint32 stack=1)
Definition Unit.cpp:11874
void HandleEmoteCommand(uint32 emoteId)
Definition Unit.cpp:2026
@ SMSG_SPELLDAMAGESHIELD
Definition Opcodes.h:621
bool HasFlagsExtra(uint32 flag) const
Definition CreatureData.h:283
bool HasInArc(float arcangle, const Position *pos, float targetRadius=0.0f) const
Definition Position.cpp:141

References CalcDamageInfo::absorb, CalcDamageInfo::attackType, BASE_ATTACK, CalcDamageInfo::blocked_amount, CalcAbsorbResist(), Player::CastItemCombatSpell(), CastSpell(), CalcDamageInfo::cleanDamage, CONFIG_ENABLE_DAZE, CREATURE_FLAG_EXTRA_NO_PARRY_HASTEN, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, DealDamage(), DealDamageMods(), DIRECT_DAMAGE, EMOTE_ONESHOT_PARRY_SHIELD, EMOTE_ONESHOT_WOUND_CRITICAL, DamageInfo::GetAbsorb(), GetAttackTime(), getAttackTimer(), GetAuraEffectsByType(), Creature::GetCreatureTemplate(), DamageInfo::GetDamage(), GetDefenseSkillValue(), Object::GetGUID(), Object::GetGUID(), GetHealth(), GetLevel(), SpellInfo::GetSchoolMask(), GetUnitMeleeSkill(), HandleEmoteCommand(), HasActivePowerType(), CreatureTemplate::HasFlagsExtra(), Position::HasInArc(), HasOffhandWeaponForAttack(), HasUnitState(), CalcDamageInfo::HitInfo, HITINFO_CRITICALHIT, CalcDamageInfo::hitOutCome, SpellInfo::Id, IsAlive(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsImmunedToDamageOrSchool(), Object::IsPlayer(), IsVehicle(), Creature::isWorldBoss(), MAX_ITEM_PROTO_DAMAGES, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_GLANCING, MELEE_HIT_NORMAL, OFF_ATTACK, POWER_RAGE, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::resist, RewardRage(), roll_chance_f(), WorldObject::SendMessageToSet(), SendSpellDamageImmune(), SendSpellMiss(), setAttackTimer(), SMSG_SPELLDAMAGESHIELD, SPELL_AURA_DAMAGE_SHIELD, SPELL_DIRECT_DAMAGE, SpellDamageBonusTaken(), SpellHitResult(), sWorld, CalcDamageInfo::target, CalcDamageInfo::TargetState, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_IN_FLIGHT, VICTIMSTATE_BLOCKS, VICTIMSTATE_DODGE, and VICTIMSTATE_PARRY.

Referenced by AttackerStateUpdate(), and spell_dk_dancing_rune_weapon::HandleProc().

◆ DealSpellDamage()

void Unit::DealSpellDamage ( SpellNonMeleeDamage damageInfo,
bool  durabilityLoss,
Spell const *  spell = nullptr 
)
1465{
1466 if (damageInfo == 0)
1467 return;
1468
1469 Unit* victim = damageInfo->target;
1470
1471 if (!victim)
1472 return;
1473
1474 if (!victim->IsAlive() || victim->IsInFlight() || (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks()))
1475 return;
1476
1477 SpellInfo const* spellProto = damageInfo->spellInfo;
1478 if (!spellProto)
1479 {
1480 LOG_DEBUG("entities.unit", "Unit::DealSpellDamage has wrong damageInfo");
1481 return;
1482 }
1483
1484 // Call default DealDamage
1485 CleanDamage cleanDamage(damageInfo->cleanDamage, damageInfo->absorb, BASE_ATTACK, MELEE_HIT_NORMAL);
1486 Unit::DealDamage(this, victim, damageInfo->damage, &cleanDamage, SPELL_DIRECT_DAMAGE, SpellSchoolMask(damageInfo->schoolMask), spellProto, durabilityLoss, false, spell);
1487}
bool IsInFlight() const
Definition Unit.h:1619
SpellInfo const * spellInfo
Definition Unit.h:498

References SpellNonMeleeDamage::absorb, BASE_ATTACK, SpellNonMeleeDamage::cleanDamage, SpellNonMeleeDamage::damage, DealDamage(), IsAlive(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsInFlight(), LOG_DEBUG, MELEE_HIT_NORMAL, SpellNonMeleeDamage::schoolMask, SPELL_DIRECT_DAMAGE, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, and Object::ToCreature().

Referenced by Spell::DoAllEffectOnTarget(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ DelayOwnedAuras()

void Unit::DelayOwnedAuras ( uint32  spellId,
ObjectGuid  caster,
int32  delaytime 
)
5519{
5520 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5521 for (; range.first != range.second; ++range.first)
5522 {
5523 Aura* aura = range.first->second;
5524 if (!caster || aura->GetCasterGUID() == caster)
5525 {
5526 if (aura->GetDuration() < delaytime)
5527 aura->SetDuration(0);
5528 else
5529 aura->SetDuration(aura->GetDuration() - delaytime);
5530
5531 // update for out of range group members (on 1 slot use)
5533 LOG_DEBUG("spells.aura", "Aura {} partially interrupted on unit {}, new duration: {} ms", aura->GetId(), GetGUID().ToString(), aura->GetDuration());
5534 }
5535 }
5536}
int32 GetDuration() const
Definition SpellAuras.h:133
void SetNeedClientUpdateForTargets() const
Definition SpellAuras.cpp:1258
void SetDuration(int32 duration, bool withMods=false)
Definition SpellAuras.cpp:868
std::pair< AuraMap::iterator, AuraMap::iterator > AuraMapBoundsNonConst
Definition Unit.h:627

References Aura::GetCasterGUID(), Aura::GetDuration(), Object::GetGUID(), Aura::GetId(), LOG_DEBUG, m_ownedAuras, Aura::SetDuration(), Aura::SetNeedClientUpdateForTargets(), and Position::ToString().

◆ DeleteCharmInfo()

void Unit::DeleteCharmInfo ( )
15896{
15897 if (!m_charmInfo)
15898 return;
15899
15901 delete m_charmInfo;
15902 m_charmInfo = nullptr;
15903}
void RestoreState()
Definition CharmInfo.cpp:46

References m_charmInfo, and CharmInfo::RestoreState().

Referenced by RemoveCharmedBy().

◆ DeMorph()

void Unit::DeMorph ( )
4406{
4408}
virtual void SetDisplayId(uint32 modelId, float displayScale=1.f)
Definition Unit.cpp:16834
uint32 GetNativeDisplayId() const
Definition Unit.h:1889

References GetNativeDisplayId(), and SetDisplayId().

Referenced by modify_commandscript::HandleMorphResetCommand().

◆ DisableRotate()

void Unit::DisableRotate ( bool  apply)
18362{
18363 if (!IsCreature())
18364 return;
18365
18366 if (apply)
18370}
@ UNIT_STATE_POSSESSED
Definition UnitDefines.h:186
void SetUnitFlag(UnitFlags flags)
UnitFlags available in UnitDefines.h.
Definition Unit.h:703

References HasUnitState(), Object::IsCreature(), RemoveUnitFlag(), SetUnitFlag(), UNIT_FLAG_POSSESSED, and UNIT_STATE_POSSESSED.

Referenced by boss_ingvar_the_plunderer::DamageTaken(), boss_thorim::boss_thorimAI::DisableThorim(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_anub_arak::boss_anub_arakAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ DisableSpline()

◆ Dismount()

void Unit::Dismount ( )
13608{
13609 if (!IsMounted())
13610 return;
13611
13614
13615 if (Player* thisPlayer = ToPlayer())
13616 {
13617 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13618 data << GetPackGUID();
13619 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13620 data << thisPlayer->GetCollisionHeight();
13621 thisPlayer->GetSession()->SendPacket(&data);
13622 }
13623
13624 WorldPacket data(SMSG_DISMOUNT, 8);
13625 data << GetPackGUID();
13626 SendMessageToSet(&data, true);
13627
13628 // dismount as a vehicle
13629 if (IsPlayer() && GetVehicleKit())
13630 {
13631 // Send other players that we are no longer a vehicle
13632 data.Initialize(SMSG_PLAYER_VEHICLE_DATA, 8 + 4);
13633 data << GetPackGUID();
13634 data << uint32(0);
13635 ToPlayer()->SendMessageToSet(&data, true);
13636 // Remove vehicle from player
13638 }
13639
13641
13642 // only resummon old pet if the player is already added to a map
13643 // this prevents adding a pet to a not created map which would otherwise cause a crash
13644 // (it could probably happen when logging in after a previous crash)
13645 if (Player* player = ToPlayer())
13646 {
13647 sScriptMgr->AnticheatSetUnderACKmount(player);
13648
13649 if (Pet* pPet = player->GetPet())
13650 {
13651 if (pPet->HasUnitFlag(UNIT_FLAG_STUNNED) && !pPet->HasUnitState(UNIT_STATE_STUNNED))
13652 pPet->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13653 }
13654 else
13655 player->ResummonPetTemporaryUnSummonedIfAny();
13656
13657 // xinef: if we have charmed npc, remove stun also
13658 if (Unit* charm = player->GetCharm())
13659 if (charm->IsCreature() && !charm->HasUnitState(UNIT_STATE_STUNNED))
13660 charm->RemoveUnitFlag(UNIT_FLAG_STUNNED);
13661 }
13662}
@ AURA_INTERRUPT_FLAG_NOT_MOUNTED
Definition SpellDefines.h:49
@ UNIT_FLAG_STUNNED
Definition UnitDefines.h:268
@ UNIT_FLAG_MOUNT
Definition UnitDefines.h:277
@ UNIT_FIELD_MOUNTDISPLAYID
Definition UpdateFields.h:126
void SendMessageToSet(WorldPacket const *data, bool self) const override
Definition Player.cpp:5697
void RemoveVehicleKit()
Definition Unit.cpp:18813
@ SMSG_PLAYER_VEHICLE_DATA
Definition Opcodes.h:1221
@ SMSG_MOVE_SET_COLLISION_HGT
Definition Opcodes.h:1332
@ SMSG_DISMOUNT
Definition Opcodes.h:970

References AURA_INTERRUPT_FLAG_NOT_MOUNTED, GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), IsMounted(), Object::IsPlayer(), RemoveAurasWithInterruptFlags(), RemoveUnitFlag(), RemoveVehicleKit(), WorldObject::SendMessageToSet(), Player::SendMessageToSet(), SetUInt32Value(), SMSG_DISMOUNT, SMSG_MOVE_SET_COLLISION_HGT, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, UNIT_FLAG_STUNNED, and UNIT_STATE_STUNNED.

Referenced by _EnterVehicle(), Player::CleanupAfterTaxiFlight(), FlightPathMovementGenerator::DoFinalize(), BattlegroundWS::EventPlayerClickedOnFlag(), AuraEffect::HandleAuraMounted(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), npc_scarlet_courier::npc_scarlet_courierAI::JustEngagedWith(), boss_mandokir::boss_mandokirAI::JustEngagedWith(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), boss_captain_skarloc::MovementInform(), spell_chapter5_light_of_dawn_aura::OnApply(), Creature::setDeathState(), SetInCombatState(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), npc_magister_aledis::StartFight(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), and npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI().

◆ EnergizeBySpell()

void Unit::EnergizeBySpell ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11355{
11356 int32 gainedPower = victim->ModifyPower(powerType, damage, false);
11357
11358 if (powerType != POWER_HAPPINESS && gainedPower)
11359 {
11360 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(spellID);
11361 victim->getHostileRefMgr().threatAssist(this, float(gainedPower) * 0.5f, spellInfo);
11362 }
11363
11364 SendEnergizeSpellLog(victim, spellID, damage, powerType);
11365}
@ POWER_HAPPINESS
Definition SharedDefines.h:273
void threatAssist(Unit *victim, float baseThreat, SpellInfo const *threatSpell=nullptr)
Definition HostileRefMgr.cpp:35
void SendEnergizeSpellLog(Unit *victim, uint32 SpellID, uint32 Damage, Powers powertype)
Definition Unit.cpp:11343

References getHostileRefMgr(), ModifyPower(), POWER_HAPPINESS, SendEnergizeSpellLog(), sSpellMgr, and HostileRefMgr::threatAssist().

Referenced by Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerDrain(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ EnterVehicle()

void Unit::EnterVehicle ( Unit base,
int8  seatId = -1 
)
19459{
19461
19462 if (Player* player = ToPlayer())
19463 {
19464 sScriptMgr->AnticheatSetUnderACKmount(player);
19465 }
19466}
@ TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE
Will ignore caster aura states including combat requirements and death state.
Definition SpellDefines.h:146
@ VEHICLE_SPELL_RIDE_HARDCODED
Definition VehicleDefines.h:52

References CastCustomSpell(), SPELLVALUE_BASE_POINT0, sScriptMgr, Object::ToPlayer(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, and VEHICLE_SPELL_RIDE_HARDCODED.

Referenced by debug_commandscript::HandleDebugEnterVehicleCommand(), WorldSession::HandleEnterPlayerVehicle(), boss_mimiron::boss_mimironAI::JustEngagedWith(), npc_pilgrims_bounty_chair::UpdateAI(), and boss_mimiron::boss_mimironAI::UpdateAI().

◆ EnterVehicleUnattackable()

void Unit::EnterVehicleUnattackable ( Unit base,
int8  seatId = -1 
)

◆ ExecuteDelayedUnitAINotifyEvent()

void Unit::ExecuteDelayedUnitAINotifyEvent ( )
20350{
20352 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20353 return;
20354
20355 Acore::AIRelocationNotifier notifier(*this);
20356 float radius = 60.0f;
20357 Cell::VisitAllObjects(this, notifier, radius);
20358}
@ NOTIFY_AI_RELOCATION
Definition Object.h:68
void RemoveFromNotify(uint16 f)
Definition Object.h:626
Definition GridNotifiers.h:91
static void VisitAllObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:185

References IsDuringRemoveFromWorld(), Object::IsInWorld(), NOTIFY_AI_RELOCATION, WorldObject::RemoveFromNotify(), and Cell::VisitAllObjects().

Referenced by Update().

◆ ExecuteDelayedUnitRelocationEvent()

void Unit::ExecuteDelayedUnitRelocationEvent ( )
20241{
20243 if (!this->IsInWorld() || this->IsDuringRemoveFromWorld())
20244 return;
20245
20246 if (this->HasSharedVision())
20247 for (SharedVisionList::const_iterator itr = this->GetSharedVisionList().begin(); itr != this->GetSharedVisionList().end(); ++itr)
20248 if (Player* player = (*itr))
20249 {
20250 if (player->IsOnVehicle(this) || !player->IsInWorld() || player->IsDuringRemoveFromWorld()) // players on vehicles have their own event executed (due to passenger relocation)
20251 continue;
20252 WorldObject* viewPoint = player;
20253 if (player->m_seer && player->m_seer->IsInWorld())
20254 viewPoint = player->m_seer;
20255 if (!viewPoint->IsPositionValid() || !player->IsPositionValid())
20256 continue;
20257
20258 if (Unit* active = viewPoint->ToUnit())
20259 {
20260 //if (active->IsVehicle()) // always check original unit here, last notify position is not relocated
20261 // active = player;
20262
20263 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20264 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20265 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20266 float distsq = dx * dx + dy * dy + dz * dz;
20267 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20268 if (distsq < mindistsq)
20269 continue;
20270
20271 // this will be relocated below sharedvision!
20272 //active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20273 }
20274
20275 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20276 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20277 relocateNoLarge.SendToSelf();
20278 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20279 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20280 relocateLarge.SendToSelf();
20281 }
20282
20283 if (Player* player = this->ToPlayer())
20284 {
20285 WorldObject* viewPoint = player;
20286 if (player->m_seer && player->m_seer->IsInWorld())
20287 viewPoint = player->m_seer;
20288
20289 if (viewPoint->GetMapId() != player->GetMapId() || !viewPoint->IsPositionValid() || !player->IsPositionValid())
20290 return;
20291
20292 if (Unit* active = viewPoint->ToUnit())
20293 {
20294 if (active->IsVehicle())
20295 active = player;
20296
20297 if (!player->GetFarSightDistance())
20298 {
20299 float dx = active->m_last_notify_position.GetPositionX() - active->GetPositionX();
20300 float dy = active->m_last_notify_position.GetPositionY() - active->GetPositionY();
20301 float dz = active->m_last_notify_position.GetPositionZ() - active->GetPositionZ();
20302 float distsq = dx * dx + dy * dy + dz * dz;
20303
20304 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(active->FindMap()->GetEntry()->map_type);
20305 if (distsq < mindistsq)
20306 return;
20307
20308 active->m_last_notify_position.Relocate(active->GetPositionX(), active->GetPositionY(), active->GetPositionZ());
20309 }
20310 }
20311
20313
20314 Acore::PlayerRelocationNotifier relocateNoLarge(*player, false); // visit only objects which are not large; default distance
20315 Cell::VisitAllObjects(viewPoint, relocateNoLarge, player->GetSightRange() + VISIBILITY_INC_FOR_GOBJECTS);
20316 relocateNoLarge.SendToSelf();
20317
20318 if (!player->GetFarSightDistance())
20319 {
20320 Acore::PlayerRelocationNotifier relocateLarge(*player, true); // visit only large objects; maximum distance
20321 Cell::VisitAllObjects(viewPoint, relocateLarge, MAX_VISIBILITY_DISTANCE);
20322 relocateLarge.SendToSelf();
20323 }
20324
20326 }
20327 else if (Creature* unit = this->ToCreature())
20328 {
20329 if (!unit->IsPositionValid())
20330 return;
20331
20332 float dx = unit->m_last_notify_position.GetPositionX() - unit->GetPositionX();
20333 float dy = unit->m_last_notify_position.GetPositionY() - unit->GetPositionY();
20334 float dz = unit->m_last_notify_position.GetPositionZ() - unit->GetPositionZ();
20335 float distsq = dx * dx + dy * dy + dz * dz;
20336 float mindistsq = DynamicVisibilityMgr::GetReqMoveDistSq(unit->FindMap()->GetEntry()->map_type);
20337 if (distsq < mindistsq)
20338 return;
20339
20340 unit->m_last_notify_position.Relocate(unit->GetPositionX(), unit->GetPositionY(), unit->GetPositionZ());
20341
20342 Acore::CreatureRelocationNotifier relocate(*unit);
20343 Cell::VisitAllObjects(unit, relocate, unit->GetVisibilityRange() + VISIBILITY_COMPENSATION);
20344
20346 }
20347}
#define MAX_VISIBILITY_DISTANCE
Definition ObjectDefines.h:31
#define VISIBILITY_INC_FOR_GOBJECTS
Definition ObjectDefines.h:28
#define VISIBILITY_COMPENSATION
Definition ObjectDefines.h:26
@ NOTIFY_VISIBILITY_CHANGED
Definition Object.h:69
static float GetReqMoveDistSq(uint32 map_type)
Definition DynamicVisibility.h:53
void LoadGridsInRange(Position const &center, float radius)
Definition Map.cpp:239
Unit * ToUnit()
Definition Object.h:210
SharedVisionList const & GetSharedVisionList()
Definition Unit.h:1790
bool HasSharedVision() const
Definition Unit.h:1793
uint32 GetMapId() const
Definition Position.h:280
void AddToNotify(uint16 f)
Definition Object.cpp:2985
Definition GridNotifiers.h:83
Definition GridNotifiers.h:75
bool IsPositionValid() const
Definition Position.cpp:176

References WorldObject::AddToNotify(), WorldObject::GetMap(), WorldLocation::GetMapId(), Position::GetPositionX(), DynamicVisibilityMgr::GetReqMoveDistSq(), GetSharedVisionList(), HasSharedVision(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Position::IsPositionValid(), Map::LoadGridsInRange(), MAX_VISIBILITY_DISTANCE, NOTIFY_AI_RELOCATION, NOTIFY_VISIBILITY_CHANGED, WorldObject::RemoveFromNotify(), Acore::VisibleNotifier::SendToSelf(), Object::ToCreature(), Object::ToPlayer(), Object::ToUnit(), VISIBILITY_COMPENSATION, VISIBILITY_INC_FOR_GOBJECTS, and Cell::VisitAllObjects().

◆ ExitVehicle()

void Unit::ExitVehicle ( Position const *  exitPosition = nullptr)

This function can be called at upper level code to initialize an exit from the passenger's side.

The following call would not even be executed successfully as the SPELL_AURA_CONTROL_VEHICLE unapply handler already calls _ExitVehicle without specifying an exitposition. The subsequent call below would return on if (!m_vehicle).

To do: We need to allow SPELL_AURA_CONTROL_VEHICLE unapply handlers in spellscripts to specify exit coordinates and either store those per passenger, or we need to init spline movement based on those coordinates in unapply handlers, and relocate exiting passengers based on Unit::moveSpline data. Either way, Coming Soon(TM)

19555{
19557 if (!m_vehicle)
19558 return;
19559
19561 if (Player* player = ToPlayer())
19562 {
19563 player->SetCanTeleport(true);
19564 }
19568 /*_ExitVehicle(exitPosition);*/
19575
19576 if (Player* player = ToPlayer())
19577 {
19578 sScriptMgr->AnticheatSetUnderACKmount(player);
19579 }
19580}
Unit * GetVehicleBase() const
Definition Unit.cpp:18828

References Object::GetGUID(), GetVehicleBase(), m_vehicle, RemoveAurasByType(), SPELL_AURA_CONTROL_VEHICLE, sScriptMgr, and Object::ToPlayer().

Referenced by _EnterVehicle(), Player::ActivateTaxiPathTo(), MotionTransport::DelayedTeleportTransport(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), WorldSession::HandleDismissControlledVehicle(), spell_warhead_detonate::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_ulduar_squeezed_lifeless::HandleInstaKill(), WorldSession::HandleRequestVehicleExit(), spell_vehicle_throw_passenger::HandleScript(), boss_kologarn_arms::boss_kologarn_armsAI::JustDied(), Player::ProcessDelayedOperations(), RemoveFromWorld(), Player::StopCastingCharm(), and Player::TeleportTo().

◆ FindCurrentSpellBySpellId()

◆ FinishSpell()

void Unit::FinishSpell ( CurrentSpellTypes  spellType,
bool  ok = true 
)
4135{
4136 Spell* spell = m_currentSpells[spellType];
4137 if (!spell)
4138 return;
4139
4140 if (spellType == CURRENT_CHANNELED_SPELL)
4141 spell->SendChannelUpdate(0);
4142
4143 spell->finish(ok);
4144}
void SendChannelUpdate(uint32 time)
Definition Spell.cpp:5215

References CURRENT_CHANNELED_SPELL, Spell::finish(), m_currentSpells, and Spell::SendChannelUpdate().

Referenced by AuraEffect::HandleFeignDeath(), AuraEffect::HandleModStealth(), npc_risen_archmage::npc_risen_archmageAI::JustEngagedWith(), boss_lord_marrowgar::UpdateAI(), and GameObject::Use().

◆ GetAffectingPlayer()

Player * Unit::GetAffectingPlayer ( ) const
10712{
10713 if (!GetCharmerOrOwnerGUID())
10714 return const_cast<Unit*>(this)->ToPlayer();
10715
10716 if (Unit* owner = GetCharmerOrOwner())
10718
10719 return nullptr;
10720}
ObjectGuid GetCharmerOrOwnerGUID() const
Definition Unit.h:1222

References GetCharmerOrOwner(), GetCharmerOrOwnerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), and Object::ToPlayer().

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), GetFactionReactionTo(), and GetReactionTo().

◆ GetAI()

UnitAI * Unit::GetAI ( )
inline
648{ return i_AI; }

References i_AI.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), spell_algalon_big_bang::CheckTargets(), DealDamage(), DealHeal(), spell_send_mug_target_picker::FilterTargets(), spell_blood_queen_bloodbolt::FilterTargets(), spell_kologarn_focused_eyebeam::FilterTargetsInitial(), npc_dream_fog::npc_dream_fogAI::GetRandomUnitFromDragonThreatList(), WorldState::HandleActiveZone(), BattlegroundIC::HandleCapturedNodes(), spell_send_mug_target_picker::HandleDummy(), spell_magtheridon_shadow_grasp_visual::HandleDummyApply(), spell_mount_check_aura::HandleEffectPeriodic(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_random_aggro::HandleOnHit(), spell_shadow_sickle_periodic_damage::HandlePeriodic(), spell_kiljaeden_armageddon_periodic_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), spell_frostwarden_handler_focus_fire::HandleScript(), spell_ayamiss_swarmer_start_loop::HandleScript(), spell_pursue::HandleScript(), spell_xt002_gravity_bomb_damage::HandleScript(), spell_the_lich_king_quake::HandleSendEvent(), npc_risen_guardian::npc_risen_guardianAI::IsSummonedBy(), npc_risen_guardian::npc_risen_guardianAI::KilledUnit(), ModifyPower(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), achievement_respect_your_elders::OnCheck(), achievement_hadronox_denied::OnCheck(), achievement_watch_him_die::OnCheck(), achievement_better_off_dred::OnCheck(), achievement_oh_novos::OnCheck(), achievement_share_the_love::OnCheck(), achievement_snakes_whyd_it_have_to_be_snakes::OnCheck(), achievement_im_on_a_boat::OnCheck(), achievement_all_you_can_eat::OnCheck(), achievement_been_waiting_long_time::OnCheck(), achievement_neck_deep_in_vile::OnCheck(), achievement_portal_jockey::OnCheck(), achievement_chaos_theory::OnCheck(), achievement_split_personality::OnCheck(), achievement_algalon_he_feeds_on_your_tears::OnCheck(), achievement_algalon_herald_of_the_titans::OnCheck(), achievement_flame_leviathan_towers::OnCheck(), achievement_flame_leviathan_shutout::OnCheck(), achievement_freya_getting_back_to_nature::OnCheck(), achievement_freya_knock_on_wood::OnCheck(), achievement_yogg_saron_drive_me_crazy::OnCheck(), achievement_yogg_saron_kiss_and_make_up::OnCheck(), achievement_intense_cold::OnCheck(), achievement_once_bitten_twice_shy::OnCheck(), spell_xt002_gravity_bomb_aura::OnPeriodic(), npc_dark_fiend::Reset(), spell_marrowgar_coldflame::SelectTarget(), and boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::SpellHit().

◆ GetAllMinionsByEntry()

void Unit::GetAllMinionsByEntry ( std::list< Creature * > &  Minions,
uint32  entry 
)
10938{
10939 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10940 {
10941 Unit* unit = *itr;
10942 ++itr;
10943 if (unit->GetEntry() == entry && unit->IsCreature()
10944 && unit->ToCreature()->IsSummon()) // minion, actually
10945 Minions.push_back(unit->ToCreature());
10946 }
10947}
bool IsSummon() const
Definition Unit.h:744

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, and Object::ToCreature().

Referenced by spell_item_gift_of_the_harvester::CheckRequirement().

◆ GetAPMultiplier()

float Unit::GetAPMultiplier ( WeaponAttackType  attType,
bool  normalized 
)
17291{
17292 if (!normalized || !IsPlayer())
17293 return float(GetAttackTime(attType)) / 1000.0f;
17294
17295 Item* Weapon = ToPlayer()->GetWeaponForAttack(attType, true);
17296 if (!Weapon)
17297 return 2.4f; // fist attack
17298
17299 switch (Weapon->GetTemplate()->InventoryType)
17300 {
17301 case INVTYPE_2HWEAPON:
17302 return 3.3f;
17303 case INVTYPE_RANGED:
17305 case INVTYPE_THROWN:
17306 return 2.8f;
17307 case INVTYPE_WEAPON:
17310 default:
17311 return Weapon->GetTemplate()->SubClass == ITEM_SUBCLASS_WEAPON_DAGGER ? 1.7f : 2.4f;
17312 }
17313}
@ ITEM_SUBCLASS_WEAPON_DAGGER
Definition ItemTemplate.h:359
@ INVTYPE_RANGED
Definition ItemTemplate.h:271
@ INVTYPE_THROWN
Definition ItemTemplate.h:281
@ INVTYPE_RANGEDRIGHT
Definition ItemTemplate.h:282
@ INVTYPE_WEAPON
Definition ItemTemplate.h:269
@ INVTYPE_WEAPONMAINHAND
Definition ItemTemplate.h:277
@ INVTYPE_WEAPONOFFHAND
Definition ItemTemplate.h:278
@ INVTYPE_2HWEAPON
Definition ItemTemplate.h:273
Weapon
Definition boss_arlokk.cpp:67
Definition Item.h:220
ItemTemplate const * GetTemplate() const
Definition Item.cpp:544
Item * GetWeaponForAttack(WeaponAttackType attackType, bool useable=false) const
Definition PlayerStorage.cpp:488
uint32 SubClass
Definition ItemTemplate.h:622

References GetAttackTime(), Item::GetTemplate(), Player::GetWeaponForAttack(), INVTYPE_2HWEAPON, INVTYPE_RANGED, INVTYPE_RANGEDRIGHT, INVTYPE_THROWN, INVTYPE_WEAPON, INVTYPE_WEAPONMAINHAND, INVTYPE_WEAPONOFFHAND, Object::IsPlayer(), ITEM_SUBCLASS_WEAPON_DAGGER, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and MeleeDamageBonusDone().

◆ GetAppliedAuras() [1/2]

◆ GetAppliedAuras() [2/2]

AuraApplicationMap const & Unit::GetAppliedAuras ( ) const
inline
1307{ return m_appliedAuras; }

References m_appliedAuras.

◆ GetArmor()

◆ getAttackerForHelper()

Unit * Unit::getAttackerForHelper ( ) const
755{
756 if (GetVictim() != nullptr)
757 return GetVictim();
758
759 if (!IsEngaged())
760 return nullptr;
761
762 if (!m_attackers.empty())
763 return *(m_attackers.begin());
764
765 return nullptr;
766}
bool IsEngaged() const
Definition Unit.h:876

References GetVictim(), IsEngaged(), and m_attackers.

Referenced by Creature::_IsTargetAcceptable(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), PetAI::SelectNextTarget(), Creature::SelectVictim(), SetControlled(), TotemAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), and PetAI::UpdateAI().

◆ getAttackers()

◆ GetAttackTime()

◆ getAttackTimer()

◆ GetAura()

Aura * Unit::GetAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5638{
5639 AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask);
5640 return aurApp ? aurApp->GetBase() : nullptr;
5641}
AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5618

References GetAuraApplication(), and AuraApplication::GetBase().

Referenced by Player::_addSpell(), Pet::addSpell(), spell_mage_burning_determination::CheckProc(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), boss_freya::boss_freyaAI::DoAction(), Spell::DoTriggersOnSpellHit(), Spell::EffectScriptEffect(), Spell::EffectTitanGrip(), Spell::EffectWeaponDmg(), getOrphanGUID(), spell_dk_scourge_strike::HandleAfterHit(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraLinked(), Aura::HandleAuraSpecificMods(), misc_commandscript::HandleAuraStacksCommand(), deserter_commandscript::HandleDeserterAdd(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_karazhan_wrath_titans_stacker::HandleDummy(), spell_charge_shield_bomber::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_item_pygmy_oil::HandleDummy(), HandleDummyAuraProc(), spell_yogg_saron_sanity_well_aura::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_hodir_flash_freeze_aura::HandleEffectPeriodic(), spell_sindragosa_frost_breath::HandleInfusion(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleRaidProcFromChargeWithValueAuraProc(), spell_putricide_unstable_experiment::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_yogg_saron_sanity_reduce::HandleScriptEffect(), spell_dk_pestilence::HandleScriptEffect(), spell_pal_seal_of_vengeance::HandleScriptEffect(), spell_pri_lightwell::HandleScriptEffect(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_spiritual_insight::npc_spiritual_insightAI::IsSummonedBy(), npc_gunship::npc_gunshipAI::JustDied(), boss_high_nethermancer_zerevor::JustEngagedWith(), npc_brew_bubble::MoveInLineOfSight(), npc_brewfest_keg_reciver::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), spell_summoning_rhyme_aura::PeriodicTick(), Player::ProcessDelayedOperations(), BattlefieldWG::PromotePlayer(), RemoveAurasDueToSpellBySteal(), Player::ResurrectPlayer(), SetAuraStack(), boss_anomalus::SetData(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_pilgrims_bounty_chair::SpellHit(), boss_jaraxxus::boss_jaraxxusAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), boss_sindragosa::boss_sindragosaAI::SpellHitTarget(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::SpellHitTarget(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::SpellHitTarget(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ GetAuraApplication()

AuraApplication * Unit::GetAuraApplication ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5619{
5620 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5621 for (; range.first != range.second; ++range.first)
5622 {
5623 AuraApplication* app = range.first->second;
5624 Aura const* aura = app->GetBase();
5625
5626 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
5627 && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5628 && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID)
5629 && (!except || except != app))
5630 {
5631 return app;
5632 }
5633 }
5634 return nullptr;
5635}
uint8 GetEffectMask() const
Definition SpellAuras.h:176
ObjectGuid GetCastItemGUID() const
Definition SpellAuras.h:103
std::pair< AuraApplicationMap::const_iterator, AuraApplicationMap::const_iterator > AuraApplicationMapBounds
Definition Unit.h:630

References AuraApplication::GetBase(), Aura::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetEffectMask(), and m_appliedAuras.

Referenced by AuraApplication::_Remove(), GetAura(), GetAuraApplicationOfRankedSpell(), HasAura(), and Spell::UpdateChanneledTargetList().

◆ GetAuraApplicationOfRankedSpell()

AuraApplication * Unit::GetAuraApplicationOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraApplication except = nullptr 
) const
5644{
5645 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5646 while (rankSpell)
5647 {
5648 if (AuraApplication* aurApp = GetAuraApplication(rankSpell, casterGUID, itemCasterGUID, reqEffMask, except))
5649 return aurApp;
5650 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5651 }
5652 return nullptr;
5653}

References GetAuraApplication(), and sSpellMgr.

Referenced by spell_warl_drain_soul::CheckProc(), and GetAuraOfRankedSpell().

◆ GetAuraCount()

uint32 Unit::GetAuraCount ( uint32  spellId) const
5739{
5740 uint32 count = 0;
5741 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5742
5743 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5744 {
5745 if (itr->second->GetBase()->GetStackAmount() == 0)
5746 ++count;
5747 else
5748 count += (uint32)itr->second->GetBase()->GetStackAmount();
5749 }
5750
5751 return count;
5752}

References m_appliedAuras.

Referenced by npc_brew_bubble::MoveInLineOfSight(), spell_valithria_suppression_aura::OnApply(), achievement_consumption_junction::OnCheck(), achievement_assembly_of_iron::OnCheck(), achievement_cant_do_that_while_stunned::OnCheck(), spell_valithria_suppression_aura::OnRemove(), SmartScript::ProcessEvent(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), spell_black_temple_spell_absorption_aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ GetAuraEffect() [1/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5591{
5592 AuraEffectList const& auras = GetAuraEffectsByType(type);
5593 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5594 {
5595 SpellInfo const* spell = (*i)->GetSpellInfo();
5596 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5597 {
5598 if (casterGUID && (*i)->GetCasterGUID() != casterGUID)
5599 continue;
5600 return (*i);
5601 }
5602 }
5603 return nullptr;
5604}
flag96 SpellFamilyFlags
Definition SpellInfo.h:388
uint32 SpellFamilyName
Definition SpellInfo.h:387
bool HasFlag(uint32 p1=0, uint32 p2=0, uint32 p3=0) const
Definition Util.h:468

References GetAuraEffectsByType(), flag96::HasFlag(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

◆ GetAuraEffect() [2/3]

AuraEffect * Unit::GetAuraEffect ( AuraType  type,
SpellFamilyNames  name,
uint32  iconId,
uint8  effIndex 
) const
5577{
5578 AuraEffectList const& auras = GetAuraEffectsByType(type);
5579 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5580 {
5581 if (effIndex != (*itr)->GetEffIndex())
5582 continue;
5583 SpellInfo const* spell = (*itr)->GetSpellInfo();
5584 if (spell->SpellIconID == iconId && spell->SpellFamilyName == name)
5585 return *itr;
5586 }
5587 return nullptr;
5588}
uint32 SpellIconID
Definition SpellInfo.h:380

References GetAuraEffectsByType(), SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

◆ GetAuraEffect() [3/3]

AuraEffect * Unit::GetAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5551{
5552 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5553 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5554 {
5555 if (itr->second->HasEffect(effIndex)
5556 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5557 {
5558 return itr->second->GetBase()->GetEffect(effIndex);
5559 }
5560 }
5561 return nullptr;
5562}

References AuraEffect::GetBase(), Aura::GetEffect(), and m_appliedAuras.

Referenced by CalculateSpellAmount(), Spell::CanAutoCast(), spell_mage_ice_barrier::CheckCast(), spell_pri_power_word_shield::CheckCast(), spell_mage_molten_armor::CheckProc(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectWeaponDmg(), GetAuraEffectOfRankedSpell(), GetDummyAuraEffect(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_dk_raise_ally::HandleDummy(), spell_dk_death_coil::HandleDummy(), spell_dk_death_strike::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_warr_execute::HandleEffect(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blessing_of_ancient_kings::HandleProc(), spell_pal_sacred_shield_base::HandleProc(), spell_pri_divine_aegis::HandleProc(), HandleProcTriggerSpell(), AuraEffect::HandleShapeshiftBoosts(), spell_warl_drain_soul::HandleTick(), npc_pet_dk_ebon_gargoyle::InitializeAI(), Guardian::InitStatsForLevel(), npc_anzu_spirit::IsSummonedBy(), MeleeDamageBonusDone(), ModSpellDuration(), spell_dk_death_and_decay::RecalculateDamage(), RemoveAurasDueToSpellByDispel(), SpellDamageBonusDone(), SpellHealingBonusTaken(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), spell_mage_incanters_absorbtion_base_AuraScript::Trigger(), and npc_hallows_end_train_fire::UpdateAI().

◆ GetAuraEffectDummy()

AuraEffect * Unit::GetAuraEffectDummy ( uint32  spellid) const
5607{
5609 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
5610 {
5611 if ((*itr)->GetId() == spellid)
5612 return *itr;
5613 }
5614
5615 return nullptr;
5616}
@ SPELL_AURA_DUMMY
Definition SpellAuraDefines.h:67

References GetAuraEffectsByType(), and SPELL_AURA_DUMMY.

Referenced by Spell::EffectWeaponDmg(), Aura::HandleAuraSpecificMods(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_dk_scourge_strike::HandleDummy(), Guardian::InitStatsForLevel(), Kill(), spell_dk_death_and_decay::RecalculateDamage(), Player::RemoveSpellMods(), and SpellHealingBonusTaken().

◆ GetAuraEffectOfRankedSpell()

AuraEffect * Unit::GetAuraEffectOfRankedSpell ( uint32  spellId,
uint8  effIndex,
ObjectGuid  casterGUID = ObjectGuid::Empty 
) const
5565{
5566 uint32 rankSpell = sSpellMgr->GetFirstSpellInChain(spellId);
5567 while (rankSpell)
5568 {
5569 if (AuraEffect* aurEff = GetAuraEffect(rankSpell, effIndex, caster))
5570 return aurEff;
5571 rankSpell = sSpellMgr->GetNextSpellInChain(rankSpell);
5572 }
5573 return nullptr;
5574}
AuraEffect * GetAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5550

References GetAuraEffect(), and sSpellMgr.

Referenced by spell_mage_fire_frost_ward::Absorb(), spell_sha_earthbind_totem::Apply(), spell_sha_earthliving_weapon::CheckProc(), GetDiseasesByCaster(), spell_dru_enrage::HandleApply(), spell_pal_avenging_wrath::HandleApply(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), SpellPctDamageModsDone(), and spell_mage_incanters_absorbtion_base_AuraScript::Trigger().

◆ GetAuraEffectsByType()

AuraEffectList const & Unit::GetAuraEffectsByType ( AuraType  type) const
inline
1351{ return m_modAuras[type]; }

References m_modAuras.

Referenced by Player::_ApplyWeaponDependentAuraMods(), Spell::_cast(), AuraApplication::_HandleEffect(), KillRewarder::_RewardXP(), CalcAbsorbResist(), CalcArmorReducedDamage(), CalcHealAbsorb(), AuraEffect::CalculateAmount(), Player::CalculateQuestRewardXP(), Spell::CheckCast(), Spell::CheckCasterAuras(), DealDamage(), DealMeleeDamage(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), RedirectSpellEvent::Execute(), spell_dk_wandering_plague::FilterTargets(), GetAuraEffect(), GetAuraEffect(), GetAuraEffectDummy(), GetDoTsByCaster(), GetMagicHitRedirectTarget(), GetMaxNegativeAuraModifier(), GetMaxNegativeAuraModifierByAffectMask(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifier(), GetMaxPositiveAuraModifierByAffectMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscValue(), Player::getMaxTimer(), GetMeleeHitRedirectTarget(), GetPhaseByAuras(), Player::GetResurrectionSpellId(), Player::GetRuneBaseCooldown(), GetTotalAuraModifier(), GetTotalAuraModifierAreaExclusive(), GetTotalAuraModifierByAffectMask(), GetTotalAuraModifierByMiscMask(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByAffectMask(), GetTotalAuraMultiplierByMiscMask(), GetTotalAuraMultiplierByMiscValue(), GetUnitCriticalChance(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), AuraEffect::HandleAuraTransform(), AuraEffect::HandleDetectAmore(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), HandleDummyAuraProc(), Spell::HandleLaunchPhase(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandleMirrorImageDataRequest(), AuraEffect::HandleModInvisibility(), modify_commandscript::HandleMorphMountCommand(), AuraEffect::HandleNoReagentUseAura(), spell_warr_heroic_strike::HandleOnHit(), spell_illidari_council_judgement::HandleScriptEffect(), spell_pal_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), HasAuraState(), HasAuraTypeWithAffectMask(), HasAuraTypeWithCaster(), HasAuraTypeWithFamilyFlags(), HasAuraTypeWithMiscvalue(), HasAuraTypeWithTriggerSpell(), HasAuraTypeWithValue(), HasBreakableByDamageAuraType(), HasVisibleAuraType(), IsImmunedToSpellEffect(), IsScriptOverriden(), SpellInfo::IsStrongerAuraActive(), Player::isTotalImmune(), list_commandscript::ListAurasCommand(), MeleeDamageBonusDone(), MeleeDamageBonusTaken(), MeleeSpellHitResult(), Spell::PrepareTriggersExecutedOnHit(), processDummyAuras(), spell_dru_enrage::RecalculateBaseArmor(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::Respawn(), RestoreDisplayId(), Spell::SelectImplicitAreaTargets(), Spell::SelectImplicitConeTargets(), PetAI::SelectNextTarget(), Creature::SelectVictim(), Player::SendInitialPacketsAfterAddToMap(), SetControlled(), Player::SetEntryPoint(), Player::SetSkill(), SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SpellBaseHealingBonusDone(), SpellBaseHealingBonusTaken(), SpellDamageBonusDone(), SpellDamageBonusTaken(), SpellHealingBonusDone(), SpellHealingBonusTaken(), SpellHitResult(), SpellHitResult(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), SpellTakenCritChance(), Player::SummonPet(), Player::TeleportTo(), SimpleCharmedAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), Player::UpdateArmor(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCharmedAI(), Player::UpdateExpertise(), Player::UpdateManaRegen(), Player::UpdateRating(), Player::UpdateResistances(), UpdateSpeed(), and Player::UpdateStats().

◆ GetAuraOfRankedSpell()

Aura * Unit::GetAuraOfRankedSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5656{
5657 AuraApplication* aurApp = GetAuraApplicationOfRankedSpell(spellId, casterGUID, itemCasterGUID, reqEffMask);
5658 return aurApp ? aurApp->GetBase() : nullptr;
5659}
AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraApplication *except=nullptr) const
Definition Unit.cpp:5643

References GetAuraApplicationOfRankedSpell(), and AuraApplication::GetBase().

Referenced by Aura::HandleAuraSpecificMods(), and spell_dk_pestilence::HandleScriptEffect().

◆ GetBoundaryRadius()

float Unit::GetBoundaryRadius ( ) const
inline
@ UNIT_FIELD_BOUNDINGRADIUS
Definition UpdateFields.h:122

References Object::m_floatValues, and UNIT_FIELD_BOUNDINGRADIUS.

Referenced by IsWithinBoundaryRadius().

◆ GetCastingTimeForBonus()

uint32 Unit::GetCastingTimeForBonus ( SpellInfo const *  spellProto,
DamageEffectType  damagetype,
uint32  CastingTime 
) const
17151{
17152 // Not apply this to creature casted spells with casttime == 0
17153 if (CastingTime == 0 && IsCreature() && !IsPet())
17154 return 3500;
17155
17156 if (CastingTime > 7000) CastingTime = 7000;
17157 if (CastingTime < 1500) CastingTime = 1500;
17158
17159 if (damagetype == DOT && !spellProto->IsChanneled())
17160 CastingTime = 3500;
17161
17162 int32 overTime = 0;
17163 uint8 effects = 0;
17164 bool DirectDamage = false;
17165 bool AreaEffect = false;
17166
17167 for (uint32 i = 0; i < MAX_SPELL_EFFECTS; i++)
17168 {
17169 switch (spellProto->Effects[i].Effect)
17170 {
17176 case SPELL_EFFECT_HEAL:
17177 DirectDamage = true;
17178 break;
17180 switch (spellProto->Effects[i].ApplyAuraName)
17181 {
17185 if (spellProto->GetDuration())
17186 overTime = spellProto->GetDuration();
17187 break;
17188 default:
17189 // -5% per additional effect
17190 ++effects;
17191 break;
17192 }
17193 default:
17194 break;
17195 }
17196
17197 if (spellProto->Effects[i].IsTargetingArea())
17198 AreaEffect = true;
17199 }
17200
17201 // Combined Spells with Both Over Time and Direct Damage
17202 if (overTime > 0 && DirectDamage)
17203 {
17204 // mainly for DoTs which are 3500 here otherwise
17205 uint32 OriginalCastTime = spellProto->CalcCastTime();
17206 if (OriginalCastTime > 7000) OriginalCastTime = 7000;
17207 if (OriginalCastTime < 1500) OriginalCastTime = 1500;
17208 // Portion to Over Time
17209 float PtOT = (overTime / 15000.0f) / ((overTime / 15000.0f) + (OriginalCastTime / 3500.0f));
17210
17211 if (damagetype == DOT)
17212 CastingTime = uint32(CastingTime * PtOT);
17213 else if (PtOT < 1.0f)
17214 CastingTime = uint32(CastingTime * (1 - PtOT));
17215 else
17216 CastingTime = 0;
17217 }
17218
17219 // Area Effect Spells receive only half of bonus
17220 if (AreaEffect)
17221 CastingTime /= 2;
17222
17223 // 50% for damage and healing spells for leech spells from damage bonus and 0% from healing
17224 for (uint8 j = 0; j < MAX_SPELL_EFFECTS; ++j)
17225 {
17226 if (spellProto->Effects[j].Effect == SPELL_EFFECT_HEALTH_LEECH ||
17227 (spellProto->Effects[j].Effect == SPELL_EFFECT_APPLY_AURA && spellProto->Effects[j].ApplyAuraName == SPELL_AURA_PERIODIC_LEECH))
17228 {
17229 CastingTime /= 2;
17230 break;
17231 }
17232 }
17233
17234 // -5% of total per any additional effect
17235 for (uint8 i = 0; i < effects; ++i)
17236 CastingTime *= 0.95f;
17237
17238 return CastingTime;
17239}
@ SPELL_EFFECT_POWER_BURN
Definition SharedDefines.h:840
@ SPELL_EFFECT_HEALTH_LEECH
Definition SharedDefines.h:787
@ SPELL_EFFECT_HEAL
Definition SharedDefines.h:788
@ SPELL_EFFECT_ENVIRONMENTAL_DAMAGE
Definition SharedDefines.h:785
@ SPELL_EFFECT_POWER_DRAIN
Definition SharedDefines.h:786
@ SPELL_EFFECT_SCHOOL_DAMAGE
Definition SharedDefines.h:780
@ SPELL_EFFECT_APPLY_AURA
Definition SharedDefines.h:784
@ SPELL_AURA_PERIODIC_DAMAGE
Definition SpellAuraDefines.h:66
@ SPELL_AURA_PERIODIC_HEAL
Definition SpellAuraDefines.h:71
@ SPELL_AURA_PERIODIC_LEECH
Definition SpellAuraDefines.h:116

References SpellInfo::CalcCastTime(), DOT, SpellInfo::Effects, SpellInfo::GetDuration(), SpellInfo::IsChanneled(), Object::IsCreature(), IsPet(), MAX_SPELL_EFFECTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_EFFECT_APPLY_AURA, SPELL_EFFECT_ENVIRONMENTAL_DAMAGE, SPELL_EFFECT_HEAL, SPELL_EFFECT_HEALTH_LEECH, SPELL_EFFECT_POWER_BURN, SPELL_EFFECT_POWER_DRAIN, and SPELL_EFFECT_SCHOOL_DAMAGE.

Referenced by CalculateDefaultCoefficient().

◆ GetCharm()

Unit * Unit::GetCharm ( ) const
10758{
10759 if (ObjectGuid charm_guid = GetCharmGUID())
10760 {
10761 if (Unit* pet = ObjectAccessor::GetUnit(*this, charm_guid))
10762 return pet;
10763
10764 LOG_ERROR("entities.unit", "Unit::GetCharm: Charmed creature {} not exist.", charm_guid.ToString());
10766 }
10767
10768 return nullptr;
10769}
@ UNIT_FIELD_CHARM
Definition UpdateFields.h:86
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:723
ObjectGuid GetCharmGUID() const
Definition Unit.h:676
Unit * GetUnit(WorldObject const &, ObjectGuid const guid)
Definition ObjectAccessor.cpp:199

References ObjectGuid::Empty, GetCharmGUID(), ObjectAccessor::GetUnit(), LOG_ERROR, Object::SetGuidValue(), and UNIT_FIELD_CHARM.

Referenced by Spell::_cast(), AddPetAura(), spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Dismount(), Spell::finish(), GetFirstControlled(), spell_warl_eye_of_kilrogg::HandleAuraApply(), spell_warl_eye_of_kilrogg::HandleAuraRemove(), spell_dk_raise_ally::HandleDummy(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), WorldSession::HandleRequestPetInfo(), isPossessing(), Mount(), Player::PossessSpellInitialize(), RemovePetAura(), Spell::SelectImplicitCasterObjectTargets(), SetSpeed(), npc_pilgrims_bounty_chair::SpellHitTarget(), and Player::StopCastingCharm().

◆ GetCharmer()

◆ GetCharmerGUID()

◆ GetCharmerOrOwner()

◆ GetCharmerOrOwnerGUID()

◆ GetCharmerOrOwnerOrOwnGUID()

◆ GetCharmerOrOwnerOrSelf()

Unit * Unit::GetCharmerOrOwnerOrSelf ( ) const
inline
1215 {
1216 if (Unit* u = GetCharmerOrOwner())
1217 return u;
1218
1219 return (Unit*)this;
1220 }

References GetCharmerOrOwner().

Referenced by CombatStart(), CombatStartOnCast(), GetPartyMembers(), GetReactionTo(), IsInPartyWith(), IsInRaidWith(), SetInCombatWith(), and TotemAI::UpdateAI().

◆ GetCharmerOrOwnerPlayerOrPlayerItself()

Player * Unit::GetCharmerOrOwnerPlayerOrPlayerItself ( ) const
10703{
10705 if (guid.IsPlayer())
10706 return ObjectAccessor::GetPlayer(*this, guid);
10707
10708 return const_cast<Unit*>(this)->ToPlayer();
10709}
Player * GetPlayer(Map const *, ObjectGuid const guid)
Definition ObjectAccessor.cpp:220

References GetCharmerOrOwnerGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), and Object::ToPlayer().

Referenced by Spell::_handle_finish_phase(), spell_sha_earthbind_totem::Apply(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), BuildValuesUpdate(), spell_q12237_rescue_villager::CheckCast(), spell_q12237_drop_off_villager::CheckCast(), CombatStart(), CombatStartOnCast(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), DealDamage(), Spell::EffectGameObjectSetDestructionState(), Spell::EffectKillCredit(), Spell::EffectKillCreditPersonal(), Spell::EffectSummonPet(), GetAffectingPlayer(), Object::GetUpdateFieldData(), spell_gen_charmed_unit_spell_cooldown::HandleCast(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_pass_generic::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_q12851_going_bearback::HandleEffectApply(), spell_q12726_song_of_wind_and_water::HandleHealPct(), spell_winter_veil_racer_slam_hit::HandleScriptEffect(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_q10769_dissension_amongst_the_ranks::HandleScriptEffect(), npc_pet_gen_valkyr_guardian::InitializeAI(), isTargetableForAttack(), GuardAI::JustDied(), boss_kurinnaxx::JustDied(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustDied(), npc_darnavan::npc_darnavanAI::JustDied(), npc_four_car_garage::npc_four_car_garageAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), Kill(), Condition::Meets(), GameObject::ModifyHealth(), npc_amanishi_lookout::MoveInLineOfSight(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), Pet::RemoveSpellCooldown(), Spell::SendSpellCooldown(), SetCharm(), SetContestedPvP(), SetInCombatState(), Creature::SetLootRecipient(), npc_deaths_door_fell_cannon_target_bunny::npc_deaths_door_fell_cannon_target_bunnyAI::SpellHit(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), and Creature::UpdateEntry().

◆ GetCharmGUID()

◆ GetCharmInfo()

◆ getClass()

uint8 Unit::getClass ( ) const
inline
793{ return GetByteValue(UNIT_FIELD_BYTES_0, 1); }
@ UNIT_FIELD_BYTES_0
Definition UpdateFields.h:95
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:323

References Object::GetByteValue(), and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), ArenaTeam::AddMember(), SpellEffectInfo::CalcValue(), Player::CheckSkillLearnedBySpell(), spell_class_call_handler::FilterTargets(), getClassMask(), GetDebugInfo(), Player::GetDodgeFromAgility(), SocialMgr::GetFriendInfo(), Player::GetMeleeCritFromAgility(), Player::GetMissPercentageFromDefence(), Player::GetPlayerName(), Player::GetRatingMultiplier(), Player::GetSpec(), Player::GetSpellCritFromIntellect(), Player::GetStartPosition(), Player::GiveLevel(), spell_item_flask_of_the_north::HandleDummy(), HandleDummyAuraProc(), learn_commandscript::HandleLearnAllMySpellsCommand(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), HandleProcTriggerSpell(), ArenaSpectator::HandleResetCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDataForForm(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Player::IsClass(), IsClass(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), ClassCallSelector::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), Player::RewardHonor(), Guild::Member::SetStats(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Player::StoreNewItemInBestSlots(), Player::UpdateDodgePercentage(), Player::UpdateParryPercentage(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getClassMask()

◆ GetCollisionHeight()

float Unit::GetCollisionHeight ( ) const
overridevirtual

Return collision height sent to client.

Reimplemented from WorldObject.

20964{
20965 float scaleMod = GetObjectScale(); // 99% sure about this
20966 float defaultHeight = DEFAULT_COLLISION_HEIGHT * scaleMod;
20967
20968 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20969 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20970 float collisionHeight = 0.0f;
20971
20972 if (IsMounted())
20973 {
20975 {
20976 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20977 {
20978 collisionHeight = scaleMod * (mountModelData->MountHeight + modelData->CollisionHeight * modelData->Scale * displayInfo->scale * 0.5f);
20979 }
20980 }
20981 }
20982 else
20983 collisionHeight = scaleMod * modelData->CollisionHeight * modelData->Scale * displayInfo->scale;
20984
20985 return collisionHeight == 0.0f ? defaultHeight : collisionHeight;
20986}
DBCStorage< CreatureDisplayInfoEntry > sCreatureDisplayInfoStore(CreatureDisplayInfofmt)
DBCStorage< CreatureModelDataEntry > sCreatureModelDataStore(CreatureModelDatafmt)
#define DEFAULT_COLLISION_HEIGHT
Definition ObjectDefines.h:50
float GetObjectScale() const
Definition Object.h:119
Definition DBCStructure.h:721
uint32 ModelId
Definition DBCStructure.h:723
float scale
Definition DBCStructure.h:726
Definition DBCStructure.h:775
float Scale
Definition DBCStructure.h:779
float CollisionHeight
Definition DBCStructure.h:790

References CreatureModelDataEntry::CollisionHeight, DEFAULT_COLLISION_HEIGHT, GetNativeDisplayId(), Object::GetObjectScale(), Object::GetUInt32Value(), IsMounted(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by DynObjAura::FillTargetMap(), GetRandomContactPoint(), WorldSession::HandleMovementOpcodes(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Spell::SelectImplicitCasterDestTargets(), spell_spawn_blood_pool::SetDest(), and Creature::UpdateMovementFlags().

◆ GetCollisionRadius()

float Unit::GetCollisionRadius ( ) const
overridevirtual

this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the radius also takes in consideration the mount size

Returns
float The radius of a unit

Reimplemented from WorldObject.

20958{
20959 return GetCollisionWidth() / 2;
20960}
float GetCollisionWidth() const override
this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by...
Definition Unit.cpp:20920

References GetCollisionWidth().

Referenced by GetMeleeAttackPoint(), and Creature::Update().

◆ GetCollisionWidth()

float Unit::GetCollisionWidth ( ) const
overridevirtual

this method gets the diameter of a Unit by DB if any value is defined, otherwise it gets the value by the DBC

If the player is mounted the diameter also takes in consideration the mount size

Returns
float The diameter of a unit

Dismounting case - use basic default model data

Reimplemented from WorldObject.

20921{
20922 if (IsPlayer())
20923 return GetObjectSize();
20924
20925 float scaleMod = GetObjectScale(); // 99% sure about this
20926 float objectSize = GetObjectSize();
20927 float defaultSize = DEFAULT_WORLD_OBJECT_SIZE * scaleMod;
20928
20930 CreatureDisplayInfoEntry const* displayInfo = sCreatureDisplayInfoStore.AssertEntry(GetNativeDisplayId());
20931 CreatureModelDataEntry const* modelData = sCreatureModelDataStore.AssertEntry(displayInfo->ModelId);
20932
20933 if (IsMounted())
20934 {
20936 {
20937 if (CreatureModelDataEntry const* mountModelData = sCreatureModelDataStore.LookupEntry(mountDisplayInfo->ModelId))
20938 {
20939 if (G3D::fuzzyGt(mountModelData->CollisionWidth, modelData->CollisionWidth))
20940 modelData = mountModelData;
20941 }
20942 }
20943 }
20944
20945 float collisionWidth = scaleMod * modelData->CollisionWidth * modelData->Scale * displayInfo->scale * 2;
20946 // if the objectSize is the default value or the creature is mounted and we have a DBC value, then we can retrieve DBC value instead
20947 return G3D::fuzzyGt(collisionWidth, 0.0f) && (G3D::fuzzyEq(objectSize,defaultSize) || IsMounted()) ? collisionWidth : objectSize;
20948}
#define DEFAULT_WORLD_OBJECT_SIZE
Definition ObjectDefines.h:45
float GetObjectSize() const
Definition Object.cpp:2780
float CollisionWidth
Definition DBCStructure.h:789

References CreatureModelDataEntry::CollisionWidth, DEFAULT_WORLD_OBJECT_SIZE, GetNativeDisplayId(), Object::GetObjectScale(), WorldObject::GetObjectSize(), Object::GetUInt32Value(), IsMounted(), Object::IsPlayer(), CreatureDisplayInfoEntry::ModelId, CreatureDisplayInfoEntry::scale, CreatureModelDataEntry::Scale, sCreatureDisplayInfoStore, sCreatureModelDataStore, and UNIT_FIELD_MOUNTDISPLAYID.

Referenced by GetCollisionRadius().

◆ GetCombatRatingDamageReduction()

uint32 Unit::GetCombatRatingDamageReduction ( CombatRating  cr,
float  rate,
float  cap,
uint32  damage 
) const
private
19281{
19282 float percent = std::min(GetCombatRatingReduction(cr) * rate, cap);
19283 return CalculatePct(damage, percent);
19284}
float GetCombatRatingReduction(CombatRating cr) const
Definition Unit.cpp:19268

References CalculatePct(), and GetCombatRatingReduction().

Referenced by GetMeleeCritDamageReduction(), GetMeleeDamageReduction(), GetRangedCritDamageReduction(), GetRangedDamageReduction(), GetSpellCritDamageReduction(), and GetSpellDamageReduction().

◆ GetCombatRatingReduction()

float Unit::GetCombatRatingReduction ( CombatRating  cr) const
private
19269{
19270 if (Player const* player = ToPlayer())
19271 return player->GetRatingBonusValue(cr);
19272 // Player's pet get resilience from owner
19273 else if (IsPet() && GetOwner())
19274 if (Player* owner = GetOwner()->ToPlayer())
19275 return owner->GetRatingBonusValue(cr);
19276
19277 return 0.0f;
19278}

References GetOwner(), IsPet(), and Object::ToPlayer().

Referenced by GetCombatRatingDamageReduction(), GetMeleeCritChanceReduction(), GetRangedCritChanceReduction(), and GetSpellCritChanceReduction().

◆ GetCombatReach()

◆ GetCombatTimer()

uint32 Unit::GetCombatTimer ( ) const
inline
889{ return m_CombatTimer; }

References m_CombatTimer.

Referenced by Spell::DoSpellHitOnUnit(), and SetInCombatState().

◆ GetComboPoints() [1/2]

uint8 Unit::GetComboPoints ( ObjectGuid const &  guid) const
inline
954{ return (m_comboTarget && m_comboTarget->GetGUID() == guid) ? m_comboPoints : 0; }

References Object::GetGUID(), m_comboPoints, and m_comboTarget.

◆ GetComboPoints() [2/2]

uint8 Unit::GetComboPoints ( Unit const *  who = nullptr) const
inline

◆ GetComboTarget()

Unit * Unit::GetComboTarget ( ) const
inline
955{ return m_comboTarget; }

References m_comboTarget.

Referenced by Player::DuelComplete(), and HandleProcTriggerSpell().

◆ GetComboTargetGUID()

ObjectGuid const Unit::GetComboTargetGUID ( ) const
inline

◆ GetCompanionPet()

Creature * Unit::GetCompanionPet ( ) const
10753{
10755}
@ SUMMON_SLOT_MINIPET
Definition SharedDefines.h:3555
Creature * GetCreature(WorldObject const &u, ObjectGuid const guid)
Definition ObjectAccessor.cpp:210

References ObjectAccessor::GetCreature(), m_SummonSlot, and SUMMON_SLOT_MINIPET.

Referenced by HandleProcTriggerSpell().

◆ GetCreateHealth()

◆ GetCreateMana()

◆ GetCreatePowers()

uint32 Unit::GetCreatePowers ( Powers  power) const
15737{
15738 // Only hunter pets have POWER_FOCUS and POWER_HAPPINESS
15739 switch (power)
15740 {
15741 case POWER_MANA:
15742 return GetCreateMana();
15743 case POWER_RAGE:
15744 return 1000;
15745 case POWER_FOCUS:
15746 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 100);
15747 case POWER_ENERGY:
15748 return 100;
15749 case POWER_HAPPINESS:
15750 return (IsPlayer() || !((Creature const*)this)->IsPet() || ((Pet const*)this)->getPetType() != HUNTER_PET ? 0 : 1050000);
15751 case POWER_RUNIC_POWER:
15752 return 1000;
15753 case POWER_RUNE:
15754 return 0;
15755 case POWER_HEALTH:
15756 return 0;
15757 default:
15758 break;
15759 }
15760
15761 return 0;
15762}
@ POWER_HEALTH
Definition SharedDefines.h:278
@ POWER_RUNIC_POWER
Definition SharedDefines.h:275
@ POWER_ENERGY
Definition SharedDefines.h:272
@ POWER_RUNE
Definition SharedDefines.h:274
@ POWER_FOCUS
Definition SharedDefines.h:271
uint32 GetCreateMana() const
Definition Unit.h:1072

References GetCreateMana(), HUNTER_PET, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_HEALTH, POWER_MANA, POWER_RAGE, POWER_RUNE, and POWER_RUNIC_POWER.

Referenced by Pet::CreateBaseAtTamed(), HandleDummyAuraProc(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), setPowerType(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ GetCreateStat()

float Unit::GetCreateStat ( Stats  stat) const
inline

◆ GetCreatorGUID()

ObjectGuid Unit::GetCreatorGUID ( ) const
inline
@ UNIT_FIELD_CREATEDBY
Definition UpdateFields.h:91

References Object::GetGuidValue(), and UNIT_FIELD_CREATEDBY.

Referenced by Condition::Meets().

◆ GetCreatureType()

uint32 Unit::GetCreatureType ( ) const
15273{
15274 if (IsPlayer())
15275 {
15277 SpellShapeshiftFormEntry const* ssEntry = sSpellShapeshiftFormStore.LookupEntry(form);
15278 if (ssEntry && ssEntry->creatureType > 0)
15279 return ssEntry->creatureType;
15280 else
15282 }
15283 else
15284 return ToCreature()->GetCreatureTemplate()->type;
15285}
DBCStorage< SpellShapeshiftFormEntry > sSpellShapeshiftFormStore(SpellShapeshiftFormEntryfmt)
@ CREATURE_TYPE_HUMANOID
Definition SharedDefines.h:2634
ShapeshiftForm
Definition UnitDefines.h:68
ShapeshiftForm GetShapeshiftForm() const
Definition Unit.h:1870
uint32 type
Definition CreatureData.h:222
Definition DBCStructure.h:1818
int32 creatureType
Definition DBCStructure.h:1824

References CREATURE_TYPE_HUMANOID, SpellShapeshiftFormEntry::creatureType, Creature::GetCreatureTemplate(), GetShapeshiftForm(), Object::IsPlayer(), sSpellShapeshiftFormStore, Object::ToCreature(), and CreatureTemplate::type.

Referenced by Creature::CanStartAttack(), spell_utgarde_pinnacle_beast_mark::CheckProc(), Spell::EffectKnockBack(), GetCreatureTypeMask(), GetUnitParryChance(), AuraEffect::HandleAuraEmpathy(), spell_dru_starfall_dummy::HandleDummy(), IsCritter(), CreatureAI::MoveInLineOfSight(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnUnitDeath(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), SetInCombatState(), and Creature::UpdateMoveInLineOfSightState().

◆ GetCreatureTypeMask()

uint32 Unit::GetCreatureTypeMask ( ) const
inline
779 {
780 uint32 creatureType = GetCreatureType();
781 return (creatureType >= 1) ? (1 << (creatureType - 1)) : 0;
782 }
uint32 GetCreatureType() const
Definition Unit.cpp:15272

References GetCreatureType().

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), SpellInfo::CheckTargetCreatureType(), MeleeDamageBonusDone(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ GetCritterGUID()

ObjectGuid Unit::GetCritterGUID ( ) const
inline

◆ GetCurrentSpell() [1/2]

◆ GetCurrentSpell() [2/2]

Spell * Unit::GetCurrentSpell ( uint32  spellType) const
inline
1496{ return m_currentSpells[spellType]; }

References m_currentSpells.

◆ GetCurrentSpellCastTime()

int32 Unit::GetCurrentSpellCastTime ( uint32  spell_id) const
4209{
4210 if (Spell const* spell = FindCurrentSpellBySpellId(spell_id))
4211 return spell->GetCastTime();
4212 return 0;
4213}
Spell * FindCurrentSpellBySpellId(uint32 spell_id) const
Definition Unit.cpp:4200

References FindCurrentSpellBySpellId(), and Spell::GetCastTime().

Referenced by CasterAI::JustEngagedWith(), CasterAI::UpdateAI(), and boss_mandokir::boss_mandokirAI::UpdateAI().

◆ getDeathState()

◆ GetDebugInfo()

std::string Unit::GetDebugInfo ( ) const
overridevirtual

Reimplemented from Object.

21194{
21195 std::stringstream sstr;
21196 sstr << WorldObject::GetDebugInfo() << "\n"
21197 << std::boolalpha
21198 << "AliveState: " << IsAlive()
21199 << " UnitMovementFlags: " << GetUnitMovementFlags() << " ExtraUnitMovementFlags: " << GetExtraUnitMovementFlags()
21200 << " Class: " << std::to_string(getClass());
21201 return sstr.str();
21202}
std::string GetDebugInfo() const override
Definition Object.cpp:2479

References getClass(), WorldObject::GetDebugInfo(), GetExtraUnitMovementFlags(), GetUnitMovementFlags(), and IsAlive().

Referenced by UnitAI::GetDebugInfo(), Creature::GetDebugInfo(), and Player::GetDebugInfo().

◆ GetDefaultMovementType()

MovementGeneratorType Unit::GetDefaultMovementType ( ) const
virtual

-------—End of Pet responses methods-------—

Reimplemented in Creature.

16718{
16719 return IDLE_MOTION_TYPE;
16720}
@ IDLE_MOTION_TYPE
Definition MotionMaster.h:39

References IDLE_MOTION_TYPE.

◆ GetDefenseSkillValue()

uint32 Unit::GetDefenseSkillValue ( Unit const *  target = nullptr) const
3654{
3655 if (IsPlayer())
3656 {
3657 // in PvP use full skill instead current skill value
3658 uint32 value = (target && target->IsPlayer())
3661 value += uint32(ToPlayer()->GetRatingBonusValue(CR_DEFENSE_SKILL));
3662 return value;
3663 }
3664 else
3665 return GetUnitMeleeSkill(target);
3666}
@ SKILL_DEFENSE
Definition SharedDefines.h:3120
@ CR_DEFENSE_SKILL
Definition Unit.h:219
uint16 GetSkillValue(uint32 skill) const
Definition Player.cpp:5478
uint16 GetMaxSkillValue(uint32 skill) const
Definition Player.cpp:5495

References CR_DEFENSE_SKILL, Player::GetMaxSkillValue(), Player::GetSkillValue(), GetUnitMeleeSkill(), Object::IsPlayer(), SKILL_DEFENSE, and Object::ToPlayer().

Referenced by spell_pal_ardent_defender::Absorb(), DealMeleeDamage(), GetUnitCriticalChance(), RollMeleeOutcomeAgainst(), SpellTakenCritChance(), Player::UpdateBlockPercentage(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetDiminishing()

DiminishingLevels Unit::GetDiminishing ( DiminishingGroup  group)
15098{
15099 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15100 {
15101 if (i->DRGroup != group)
15102 continue;
15103
15104 if (!i->hitCount)
15105 return DIMINISHING_LEVEL_1;
15106
15107 if (!i->hitTime)
15108 return DIMINISHING_LEVEL_1;
15109
15110 // If last spell was casted more than 15 seconds ago - reset the count.
15111 if (i->stack == 0 && getMSTimeDiff(i->hitTime, GameTime::GetGameTimeMS().count()) > 15000)
15112 {
15113 i->hitCount = DIMINISHING_LEVEL_1;
15114 return DIMINISHING_LEVEL_1;
15115 }
15116 // or else increase the count.
15117 else
15118 return DiminishingLevels(i->hitCount);
15119 }
15120 return DIMINISHING_LEVEL_1;
15121}
uint32 getMSTimeDiff(uint32 oldMSTime, uint32 newMSTime)
Definition Timer.h:110

References DIMINISHING_LEVEL_1, GameTime::GetGameTimeMS(), getMSTimeDiff(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ GetDirectTransport()

TransportBase * Unit::GetDirectTransport ( ) const

◆ GetDiseasesByCaster()

uint32 Unit::GetDiseasesByCaster ( ObjectGuid  casterGUID,
uint8  mode = 0 
)
5901{
5902 static const AuraType diseaseAuraTypes[] =
5903 {
5904 SPELL_AURA_PERIODIC_DAMAGE, // Frost Fever and Blood Plague
5905 SPELL_AURA_LINKED, // Crypt Fever and Ebon Plague
5907 };
5908
5909 ObjectGuid drwGUID;
5910
5911 if (Player* playerCaster = ObjectAccessor::GetPlayer(*this, casterGUID))
5912 drwGUID = playerCaster->getRuneWeaponGUID();
5913
5914 uint32 diseases = 0;
5915 for (uint8 index = 0; diseaseAuraTypes[index] != SPELL_AURA_NONE; ++index)
5916 {
5917 for (AuraEffectList::iterator i = m_modAuras[diseaseAuraTypes[index]].begin(); i != m_modAuras[diseaseAuraTypes[index]].end();)
5918 {
5919 // Get auras with disease dispel type by caster
5920 if ((*i)->GetSpellInfo()->Dispel == DISPEL_DISEASE
5921 && ((*i)->GetCasterGUID() == casterGUID || (*i)->GetCasterGUID() == drwGUID)) // if its caster or his dancing rune weapon
5922 {
5923 ++diseases;
5924
5925 if (mode == 1)
5926 {
5927 RemoveAura((*i)->GetId(), (*i)->GetCasterGUID());
5928 i = m_modAuras[diseaseAuraTypes[index]].begin();
5929 continue;
5930 }
5931 // used for glyph of scourge strike
5932 else if (mode == 2)
5933 {
5934 Aura* aura = (*i)->GetBase();
5935 uint32 countMin = aura->GetMaxDuration();
5936 uint32 countMax = aura->GetSpellInfo()->GetMaxDuration() + 9000;
5937
5938 if (AuraEffect const* epidemic = (*i)->GetCaster()->GetAuraEffectOfRankedSpell(49036, EFFECT_0))
5939 countMax += epidemic->GetAmount();
5940
5941 if (countMin < countMax)
5942 {
5943 aura->SetDuration(uint32(aura->GetDuration() + 3000));
5944 aura->SetMaxDuration(countMin + 3000);
5945 }
5946 }
5947 }
5948 ++i;
5949 }
5950 }
5951 return diseases;
5952}
@ EFFECT_0
Definition SharedDefines.h:31
@ DISPEL_DISEASE
Definition SharedDefines.h:1375
AuraType
Definition SpellAuraDefines.h:62
@ SPELL_AURA_LINKED
Definition SpellAuraDefines.h:347
@ SPELL_AURA_NONE
Definition SpellAuraDefines.h:63
int32 GetMaxDuration() const
Definition SpellAuras.h:129
void SetMaxDuration(int32 duration)
Definition SpellAuras.h:130
int32 GetMaxDuration() const
Definition SpellInfo.cpp:2357
AuraEffect * GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID=ObjectGuid::Empty) const
Definition Unit.cpp:5564

References DISPEL_DISEASE, EFFECT_0, GetAuraEffectOfRankedSpell(), AuraEffect::GetCaster(), Aura::GetDuration(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), ObjectAccessor::GetPlayer(), Aura::GetSpellInfo(), m_modAuras, RemoveAura(), Aura::SetDuration(), Aura::SetMaxDuration(), SPELL_AURA_LINKED, SPELL_AURA_NONE, and SPELL_AURA_PERIODIC_DAMAGE.

Referenced by Spell::EffectWeaponDmg(), MeleeDamageBonusDone(), and SpellPctDamageModsDone().

◆ GetDispellableAuraList()

void Unit::GetDispellableAuraList ( Unit caster,
uint32  dispelMask,
DispelChargesList dispelList,
SpellInfo const *  dispelSpell 
)
5662{
5663 // we should not be able to dispel diseases if the target is affected by unholy blight
5664 if (dispelMask & (1 << DISPEL_DISEASE) && HasAura(50536))
5665 dispelMask &= ~(1 << DISPEL_DISEASE);
5666
5667 ReputationRank rank = GetReactionTo(caster, IsCharmed());
5668 bool positive = rank >= REP_FRIENDLY;
5669
5670 // Neutral unit not at war with caster should be treated as a friendly unit
5671 if (rank == REP_NEUTRAL)
5672 {
5673 if (Player* casterPlayer = caster->GetAffectingPlayer())
5674 {
5675 if (FactionTemplateEntry const* factionTemplateEntry = GetFactionTemplateEntry())
5676 {
5677 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
5678 {
5679 if (factionEntry->CanBeSetAtWar())
5680 {
5681 positive = !casterPlayer->GetReputationMgr().IsAtWar(factionEntry);
5682 }
5683 }
5684 }
5685 }
5686 }
5687
5688 Unit::VisibleAuraMap const* visibleAuras = GetVisibleAuras();
5689 for (Unit::VisibleAuraMap::const_iterator itr = visibleAuras->begin(); itr != visibleAuras->end(); ++itr)
5690 {
5691 Aura* aura = itr->second->GetBase();
5692
5693 // don't try to remove passive auras
5694 if (aura->IsPassive())
5695 continue;
5696
5697 if (aura->GetSpellInfo()->GetDispelMask() & dispelMask)
5698 {
5699 if (aura->GetSpellInfo()->Dispel == DISPEL_MAGIC)
5700 {
5701 // do not remove positive auras if friendly target
5702 // negative auras if non-friendly target
5703 if (itr->second->IsPositive() == positive)
5704 continue;
5705 }
5706
5707 // Banish should only be dispelled by Mass Dispel
5708 if (aura->GetSpellInfo()->Mechanic == MECHANIC_BANISH && !dispelSpell->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
5709 {
5710 continue;
5711 }
5712
5713 // The charges / stack amounts don't count towards the total number of auras that can be dispelled.
5714 // Ie: A dispel on a target with 5 stacks of Winters Chill and a Polymorph has 1 / (1 + 1) -> 50% chance to dispell
5715 // Polymorph instead of 1 / (5 + 1) -> 16%.
5716 bool dispel_charges = aura->GetSpellInfo()->HasAttribute(SPELL_ATTR7_DISPEL_REMOVES_CHARGES);
5717 uint8 charges = dispel_charges ? aura->GetCharges() : aura->GetStackAmount();
5718 if (charges > 0)
5719 dispelList.push_back(std::make_pair(aura, charges));
5720 }
5721 }
5722}
@ SPELL_ATTR7_DISPEL_REMOVES_CHARGES
Definition SharedDefines.h:651
@ MECHANIC_BANISH
Definition SharedDefines.h:1343
@ SPELL_ATTR0_NO_IMMUNITIES
Definition SharedDefines.h:411
@ REP_FRIENDLY
Definition SharedDefines.h:184
@ DISPEL_MAGIC
Definition SharedDefines.h:1373
uint8 GetStackAmount() const
Definition SpellAuras.h:148
uint8 GetCharges() const
Definition SpellAuras.h:141
bool IsPassive() const
Definition SpellAuras.cpp:1082
uint32 Mechanic
Definition SpellInfo.h:323
uint32 Dispel
Definition SpellInfo.h:322
bool HasAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5777
std::map< uint8, AuraApplication * > VisibleAuraMap
Definition Unit.h:642
VisibleAuraMap const * GetVisibleAuras()
Definition Unit.h:1458

References SpellInfo::Dispel, DISPEL_DISEASE, DISPEL_MAGIC, GetAffectingPlayer(), Aura::GetCharges(), SpellInfo::GetDispelMask(), GetFactionTemplateEntry(), GetReactionTo(), Aura::GetSpellInfo(), Aura::GetStackAmount(), GetVisibleAuras(), SpellInfo::HasAttribute(), HasAura(), IsCharmed(), Aura::IsPassive(), SpellInfo::Mechanic, MECHANIC_BANISH, REP_FRIENDLY, REP_NEUTRAL, sFactionStore, SPELL_ATTR0_NO_IMMUNITIES, and SPELL_ATTR7_DISPEL_REMOVES_CHARGES.

Referenced by Spell::CheckCast(), and Spell::EffectDispel().

◆ GetDisplayId()

◆ GetDisplayRace()

DisplayRace Unit::GetDisplayRace ( ) const
inline
DisplayRace GetDisplayRaceFromModelId(uint32 modelId) const
Definition Unit.cpp:20882
uint32 GetDisplayId() const
Definition Unit.h:1887

References GetDisplayId(), and GetDisplayRaceFromModelId().

Referenced by AuraEffect::HandleAuraTransform().

◆ GetDisplayRaceFromModelId()

DisplayRace Unit::GetDisplayRaceFromModelId ( uint32  modelId) const
20883{
20884 if (CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(modelId))
20885 {
20886 if (CreatureDisplayInfoExtraEntry const* displayExtra = sCreatureDisplayInfoExtraStore.LookupEntry(display->ExtendedDisplayInfoID))
20887 {
20888 return DisplayRace(displayExtra->DisplayRaceID);
20889 }
20890 }
20891 return DisplayRace::None;
20892}
DBCStorage< CreatureDisplayInfoExtraEntry > sCreatureDisplayInfoExtraStore(CreatureDisplayInfoExtrafmt)
DisplayRace
Definition SharedDefines.h:111
Definition DBCStructure.h:739

References None, sCreatureDisplayInfoExtraStore, and sCreatureDisplayInfoStore.

Referenced by GetDisplayRace().

◆ GetDoTsByCaster()

uint32 Unit::GetDoTsByCaster ( ObjectGuid  casterGUID) const
5955{
5956 static const AuraType diseaseAuraTypes[] =
5957 {
5961 };
5962
5963 uint32 dots = 0;
5964 for (AuraType const* itr = &diseaseAuraTypes[0]; itr && itr[0] != SPELL_AURA_NONE; ++itr)
5965 {
5966 Unit::AuraEffectList const& auras = GetAuraEffectsByType(*itr);
5967 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5968 {
5969 // Get auras by caster
5970 if ((*i)->GetCasterGUID() == casterGUID)
5971 ++dots;
5972 }
5973 }
5974 return dots;
5975}
@ SPELL_AURA_PERIODIC_DAMAGE_PERCENT
Definition SpellAuraDefines.h:152

References GetAuraEffectsByType(), SPELL_AURA_NONE, SPELL_AURA_PERIODIC_DAMAGE, and SPELL_AURA_PERIODIC_DAMAGE_PERCENT.

Referenced by SpellPctDamageModsDone().

◆ GetDummyAuraEffect()

◆ GetDynamicFlags()

◆ GetDynObject()

DynamicObject * Unit::GetDynObject ( uint32  spellId)
6216{
6217 if (m_dynObj.empty())
6218 return nullptr;
6219 for (DynObjectList::const_iterator i = m_dynObj.begin(); i != m_dynObj.end(); ++i)
6220 {
6221 DynamicObject* dynObj = *i;
6222 if (dynObj->GetSpellId() == spellId)
6223 return dynObj;
6224 }
6225 return nullptr;
6226}
Definition DynamicObject.h:35
uint32 GetSpellId() const
Definition DynamicObject.h:58

References DynamicObject::GetSpellId(), and m_dynObj.

Referenced by Spell::DelayedChannel(), WorldSession::HandleFarSightOpcode(), and boss_akilzon::JustEngagedWith().

◆ GetEffectiveResistChance()

float Unit::GetEffectiveResistChance ( Unit const *  owner,
SpellSchoolMask  schoolMask,
Unit const *  victim 
)
static
2140{
2141 float victimResistance = float(victim->GetResistance(schoolMask));
2142 if (owner)
2143 {
2144 // Xinef: pets inherit 100% of masters penetration
2145 // Xinef: excluding traps
2146 Player const* player = owner->GetSpellModOwner();
2147 if (player && owner->GetEntry() != WORLD_TRIGGER)
2148 {
2149 victimResistance += float(player->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2150 victimResistance -= float(player->GetSpellPenetrationItemMod());
2151 }
2152 else
2153 victimResistance += float(owner->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_TARGET_RESISTANCE, schoolMask));
2154 }
2155
2156 victimResistance = std::max(victimResistance, 0.0f);
2157 if (owner)
2158 victimResistance += std::max((float(victim->GetLevel()) - float(owner->GetLevel())) * 5.0f, 0.0f);
2159
2160 static uint32 const BOSS_LEVEL = 83;
2161 static float const BOSS_RESISTANCE_CONSTANT = 510.0f;
2162 uint32 level = victim->GetLevel();
2163 float resistanceConstant = 0.0f;
2164
2165 if (level == BOSS_LEVEL)
2166 resistanceConstant = BOSS_RESISTANCE_CONSTANT;
2167 else
2168 resistanceConstant = level * 5.0f;
2169
2170 return victimResistance / (victimResistance + resistanceConstant);
2171}
int32 GetSpellPenetrationItemMod() const
Definition Player.h:1985

References Object::GetEntry(), GetLevel(), GetResistance(), GetSpellModOwner(), Player::GetSpellPenetrationItemMod(), GetTotalAuraModifierByMiscMask(), SPELL_AURA_MOD_TARGET_RESISTANCE, and WORLD_TRIGGER.

Referenced by CalcAbsorbResist(), and MagicSpellHitResult().

◆ GetExtraUnitMovementFlags()

uint16 Unit::GetExtraUnitMovementFlags ( ) const
inline

◆ GetFaction()

uint32 Unit::GetFaction ( ) const
inline

References Object::GetUInt32Value(), and UNIT_FIELD_FACTIONTEMPLATE.

Referenced by npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::AttackStart(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::AttackStart(), Creature::CanAssistTo(), spell_q10985_light_of_the_naaru::CheckProc(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), Spell::EffectDuel(), Spell::EffectSummonType(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::EnterEvadeMode(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::EnterEvadeMode(), npc_chesspiece::GetDefaultOrientationForTeam(), GetFactionTemplateEntry(), GetReactionTo(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), WorldSession::HandleGossipHelloOpcode(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcGuidCommand(), npc_commandscript::HandleNpcInfoCommand(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandlePlayerLoginFromDB(), TempSummon::InitStats(), InitTamedPet(), IsFriendly(), IsInPartyWith(), IsInRaidWith(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_escortAI::JustRespawned(), FollowerAI::JustRespawned(), SmartAI::JustRespawned(), boss_volkhan::boss_volkhanAI::JustSummoned(), Pet::LoadPetFromDB(), npc_chesspiece::npc_chesspiece(), npc_plucky::npc_pluckyAI::npc_pluckyAI(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::npc_taskmaster_fizzuleAI(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), npc_eris_hevenfire::OnQuestAccept(), npc_cork_gizelton::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), PatchValuesUpdate(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), npc_swarm_scarab::npc_swarm_scarabAI::Reset(), npc_future_you::npc_future_youAI::Reset(), WorldSession::SendAuctionHello(), SetCharmedBy(), Player::SetGameMaster(), npc_chesspiece::sGossipHello(), boss_malchezaar::SpawnInfernal(), Spell::SummonGuardian(), Player::SummonPet(), npc_chesspiece::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), and Creature::UpdateMoveInLineOfSightState().

◆ GetFactionReactionTo()

ReputationRank Unit::GetFactionReactionTo ( FactionTemplateEntry const *  factionTemplateEntry,
Unit const *  target 
) const
10246{
10247 // always neutral when no template entry found
10248 if (!factionTemplateEntry)
10249 return REP_NEUTRAL;
10250
10251 FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry();
10252 if (!targetFactionTemplateEntry)
10253 return REP_NEUTRAL;
10254
10255 // xinef: check forced reputation for self also
10256 if (Player const* selfPlayerOwner = GetAffectingPlayer())
10257 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(target->GetFactionTemplateEntry()))
10258 return *repRank;
10259
10260 if (Player const* targetPlayerOwner = target->GetAffectingPlayer())
10261 {
10262 // check contested flags
10263 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10264 && targetPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10265 return REP_HOSTILE;
10266 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(factionTemplateEntry))
10267 return *repRank;
10268 if (!target->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10269 {
10270 if (FactionEntry const* factionEntry = sFactionStore.LookupEntry(factionTemplateEntry->faction))
10271 {
10272 if (factionEntry->CanHaveReputation())
10273 {
10274 // CvP case - check reputation, don't allow state higher than neutral when at war
10275 ReputationRank repRank = targetPlayerOwner->GetReputationMgr().GetRank(factionEntry);
10276 if (targetPlayerOwner->GetReputationMgr().IsAtWar(factionEntry))
10277 repRank = std::min(REP_NEUTRAL, repRank);
10278 return repRank;
10279 }
10280 }
10281 }
10282 }
10283
10284 // common faction based check
10285 if (factionTemplateEntry->IsHostileTo(*targetFactionTemplateEntry))
10286 return REP_HOSTILE;
10287 if (factionTemplateEntry->IsFriendlyTo(*targetFactionTemplateEntry))
10288 return REP_FRIENDLY;
10289 if (targetFactionTemplateEntry->IsFriendlyTo(*factionTemplateEntry))
10290 return REP_FRIENDLY;
10291 if (factionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS)
10292 return REP_HOSTILE;
10293 // neutral by default
10294 return REP_NEUTRAL;
10295}
@ FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS
Definition DBCEnums.h:332
@ FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
Definition DBCEnums.h:331
@ PLAYER_FLAGS_CONTESTED_PVP
Definition Player.h:488
@ UNIT_FLAG2_IGNORE_REPUTATION
Definition UnitDefines.h:291
bool IsFriendlyTo(FactionTemplateEntry const &entry) const
Definition DBCStructure.h:951

References FactionTemplateEntry::faction, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, FACTION_TEMPLATE_FLAG_HATES_ALL_EXCEPT_FRIENDS, FactionTemplateEntry::factionFlags, GetAffectingPlayer(), GetFactionTemplateEntry(), HasUnitFlag2(), FactionTemplateEntry::IsFriendlyTo(), FactionTemplateEntry::IsHostileTo(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HOSTILE, REP_NEUTRAL, sFactionStore, and UNIT_FLAG2_IGNORE_REPUTATION.

Referenced by GetReactionTo().

◆ GetFactionTemplateEntry()

FactionTemplateEntry const * Unit::GetFactionTemplateEntry ( ) const
10096{
10097 FactionTemplateEntry const* entry = sFactionTemplateStore.LookupEntry(GetFaction());
10098 if (!entry)
10099 {
10100 static ObjectGuid guid; // prevent repeating spam same faction problem
10101
10102 if (GetGUID() != guid)
10103 {
10104 if (Player const* player = ToPlayer())
10105 LOG_ERROR("entities.unit", "Player {} has invalid faction (faction template id) #{}", player->GetName(), GetFaction());
10106 else if (Creature const* creature = ToCreature())
10107 LOG_ERROR("entities.unit", "Creature (template id: {}) has invalid faction (faction template id) #{}", creature->GetCreatureTemplate()->Entry, GetFaction());
10108 else
10109 LOG_ERROR("entities.unit", "Unit (name={}, type={}) has invalid faction (faction template id) #{}", GetName(), uint32(GetTypeId()), GetFaction());
10110
10111 guid = GetGUID();
10112 }
10113 }
10114 return entry;
10115}
DBCStorage< FactionTemplateEntry > sFactionTemplateStore(FactionTemplateEntryfmt)
TypeID GetTypeId() const
Definition Object.h:128
uint32 GetFaction() const
Definition Unit.h:801
std::string const & GetName() const
Definition Object.h:514

References GetFaction(), Object::GetGUID(), WorldObject::GetName(), Object::GetTypeId(), LOG_ERROR, sFactionTemplateStore, Object::ToCreature(), and Object::ToPlayer().

Referenced by _IsValidAttackTarget(), Player::CanUseBattlegroundObject(), npc_necrotic_shard::DamageTaken(), HostileRefMgr::deleteReferencesForFaction(), Spell::EffectGameObjectDamage(), GetDispellableAuraList(), GetFactionReactionTo(), GetReactionTo(), Player::GetReputationPriceDiscount(), IsContestedGuard(), IsHostileToPlayers(), IsNeutralToAll(), npc_chesspiece::OnCharmed(), PatchValuesUpdate(), and RespondsToCallForHelp().

◆ GetFirstControlled()

Unit * Unit::GetFirstControlled ( ) const
11162{
11163 // Sequence: charmed, pet, other guardians
11164 Unit* unit = GetCharm();
11165 if (!unit)
11166 if (ObjectGuid guid = GetMinionGUID())
11167 unit = ObjectAccessor::GetUnit(*this, guid);
11168
11169 return unit;
11170}
ObjectGuid GetMinionGUID() const
Definition Unit.h:672

References GetCharm(), GetMinionGUID(), and ObjectAccessor::GetUnit().

Referenced by Player::CharmSpellInitialize(), CombatStart(), WorldSession::HandlePetSetAction(), and RemoveCharmedBy().

◆ GetFirstCurrentCastingSpell()

Spell * Unit::GetFirstCurrentCastingSpell ( ) const
4192{
4193 for (uint32 i = 0; i < CURRENT_MAX_SPELL; i++)
4194 if (m_currentSpells[i] && m_currentSpells[i]->GetCastTimeRemaining() > 0)
4195 return m_currentSpells[i];
4196
4197 return nullptr;
4198}

References CURRENT_MAX_SPELL, and m_currentSpells.

Referenced by ChaseMovementGenerator< T >::DoUpdate().

◆ GetFirstMinion()

Minion * Unit::GetFirstMinion ( ) const
10723{
10724 if (ObjectGuid pet_guid = GetMinionGUID())
10725 {
10726 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10727 if (pet->HasUnitTypeMask(UNIT_MASK_MINION))
10728 return (Minion*)pet;
10729
10730 LOG_ERROR("entities.unit", "Unit::GetFirstMinion: Minion {} not exist.", pet_guid.ToString());
10731 const_cast<Unit*>(this)->SetMinionGUID(ObjectGuid::Empty);
10732 }
10733
10734 return nullptr;
10735}
void SetMinionGUID(ObjectGuid guid)
Definition Unit.h:673
Creature * GetCreatureOrPetOrVehicle(WorldObject const &, ObjectGuid const)
Definition ObjectAccessor.cpp:234

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetMinionGUID(), LOG_ERROR, SetMinionGUID(), and UNIT_MASK_MINION.

◆ GetFollowAngle()

◆ GetGameObject()

GameObject * Unit::GetGameObject ( uint32  spellId) const
6257{
6258 for (GameObjectList::const_iterator itr = m_gameObj.begin(); itr != m_gameObj.end(); ++itr)
6259 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6260 if (go->GetSpellId() == spellId)
6261 return go;
6262
6263 return nullptr;
6264}

References ObjectAccessor::GetGameObject(), and m_gameObj.

Referenced by Player::GetGameObjectIfCanInteractWith(), and Player::TeleportTo().

◆ getGender()

◆ GetGuardianPet()

Guardian * Unit::GetGuardianPet ( ) const
10738{
10739 if (ObjectGuid pet_guid = GetPetGUID())
10740 {
10741 if (Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*this, pet_guid))
10742 if (pet->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10743 return (Guardian*)pet;
10744
10745 LOG_FATAL("entities.unit", "Unit::GetGuardianPet: Guardian {} not exist.", pet_guid.ToString());
10746 const_cast<Unit*>(this)->SetPetGUID(ObjectGuid::Empty);
10747 }
10748
10749 return nullptr;
10750}
#define LOG_FATAL(filterType__,...)
Definition Log.h:154
Definition TemporarySummon.h:96
void SetPetGUID(ObjectGuid guid)
Definition Unit.h:677
ObjectGuid GetPetGUID() const
Definition Unit.h:678

References ObjectGuid::Empty, ObjectAccessor::GetCreatureOrPetOrVehicle(), GetPetGUID(), LOG_FATAL, SetPetGUID(), and UNIT_MASK_GUARDIAN.

Referenced by spell_hun_check_pet_los::CheckCast(), Spell::CheckCast(), Spell::EffectSummonPet(), GetNextRandomRaidMemberOrPet(), AuraEffect::HandleAuraDummy(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), AuraEffect::HandleModDamageDone(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePetSpellAutocastOpcode(), Spell::SelectImplicitCasterObjectTargets(), and SetMinion().

◆ GetHealth()

uint32 Unit::GetHealth ( ) const
inline
@ UNIT_FIELD_HEALTH
Definition UpdateFields.h:96

References Object::GetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_SaveCharacter(), spell_yogg_saron_protective_gaze_aura::Absorb(), spell_pri_guardian_spirit::Absorb(), spell_rog_cheat_death::Absorb(), spell_pal_ardent_defender::Absorb(), boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), Spell::CheckPower(), CountPctFromCurHealth(), ScriptedAI::DamageTaken(), boss_eregos::boss_eregosAI::DamageTaken(), boss_razorgore::boss_razorgoreAI::DamageTaken(), boss_majordomo::boss_majordomoAI::DamageTaken(), boss_ragnaros::boss_ragnarosAI::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_julianne::DamageTaken(), boss_romulo::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), npc_dark_fiend::DamageTaken(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::DamageTaken(), boss_headless_horseman::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), npc_argent_soldier::npc_argent_soldierAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_announcer_toc5::npc_announcer_toc5AI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_ick::boss_ickAI::DamageTaken(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::DamageTaken(), boss_drakkari_colossus::boss_drakkari_colossusAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_collapsing_star::npc_collapsing_starAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_akama_illidan::DamageTaken(), npc_maiev_illidan::DamageTaken(), boss_illidari_council::DamageTaken(), boss_illidari_council_memberAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_the_lurker_below::DamageTaken(), npc_shattered_hand_scout::DamageTaken(), boss_alar::DamageTaken(), advisor_baseAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_hor_leader_second::npc_hor_leader_secondAI::DamageTaken(), npc_ice_tomb::npc_ice_tombAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_nightbane::DamageTaken(), boss_thekal::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), boss_illidan_stormrage::DamageTaken(), npc_garr_firesworn::npc_garr_fireswornAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), SmartAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kologarn::boss_kologarnAI::DamageTaken(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), DealMeleeDamage(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), npc_the_scourge_cauldron::npc_the_scourge_cauldronAI::DoDie(), Spell::EffectHealMaxHealth(), Spell::EffectInstaKill(), Pet::FillPetInfo(), boss_supremus::FindHatefulStrikeTarget(), GetHealthGain(), GetHealthPct(), spell_illidari_council_empyreal_balance::HandleAfterCast(), spell_illidari_council_empyreal_equivalency::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_rajaxx_thundercrash::HandleDamageCalc(), misc_commandscript::HandleDieCommand(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), npc_commandscript::HandleNpcInfoCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_item_blood_draining_enchant::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), HealthAbovePct(), HealthAbovePctHealed(), HealthBelowPct(), HealthBelowPctDamaged(), IsFullHealth(), npc_dirt_mound::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), Kill(), ModifyHealth(), spell_xt002_gravity_bomb_aura::OnPeriodic(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), Creature::ResetPlayerDamageReq(), Player::SaveHealthBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), SendAttackStateUpdate(), SendSpellNonMeleeDamageLog(), SendSpellNonMeleeReflectLog(), SetMaxHealth(), boss_eadric::boss_eadricAI::SpellHit(), boss_headless_horseman_head::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), boss_ouro::Submerge(), Aura::Update(), boss_headless_horseman::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), Player::UpdateCharmedAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ GetHealthGain()

int32 Unit::GetHealthGain ( int32  dVal)
14214{
14215 int32 gain = 0;
14216
14217 if (dVal == 0)
14218 return 0;
14219
14220 int32 curHealth = (int32)GetHealth();
14221
14222 int32 val = dVal + curHealth;
14223 if (val <= 0)
14224 {
14225 return -curHealth;
14226 }
14227
14228 int32 maxHealth = (int32)GetMaxHealth();
14229
14230 if (val < maxHealth)
14231 gain = dVal;
14232 else if (curHealth != maxHealth)
14233 gain = maxHealth - curHealth;
14234
14235 return gain;
14236}

References GetHealth(), and GetMaxHealth().

Referenced by Spell::DoAllEffectOnTarget().

◆ GetHealthPct()

◆ getHostileRefMgr()

◆ GetHoverHeight()

float Unit::GetHoverHeight ( ) const
inline

◆ GetInterruptMask()

uint32 Unit::GetInterruptMask ( ) const
inline
1522{ return m_interruptMask; }

References m_interruptMask.

◆ GetLastDamagedTargetGuid()

ObjectGuid const & Unit::GetLastDamagedTargetGuid ( ) const
inline
912{ return _lastDamagedTargetGuid; }

References _lastDamagedTargetGuid.

◆ GetLastExtraAttackSpell()

uint32 Unit::GetLastExtraAttackSpell ( ) const
inline
949{ return _lastExtraAttackSpell; }

References _lastExtraAttackSpell.

Referenced by HandleProcTriggerSpell().

◆ GetLevel()

uint8 Unit::GetLevel ( ) const
inline
@ UNIT_FIELD_LEVEL
Definition UpdateFields.h:114

References Object::GetUInt32Value(), and UNIT_FIELD_LEVEL.

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDamage(), KillRewarder::_InitGroupData(), Pet::_LoadAuras(), KillRewarder::_RewardPlayer(), KillRewarder::_RewardXP(), Player::_SaveCharacter(), Player::_SaveStats(), spell_pal_ardent_defender::Absorb(), Pet::addSpell(), Spell::AddUnitTarget(), Player::ApplyEnchantment(), AuraEffect::AuraEffect(), BattlegroundMgr::BuildBattlegroundListPacket(), WorldSession::BuildPartyMemberStatsChangedPacket(), CalcArmorReducedDamage(), SpellInfo::CalcPowerCost(), SpellEffectInfo::CalcRadius(), spell_gen_disabled_above_63::CalculateAmount(), spell_item_arcane_shroud::CalculateAmount(), spell_item_the_eye_of_diminution::CalculateAmount(), AuraEffect::CalculateAmount(), CalculateLevelPenalty(), CalculateMeleeDamage(), Player::CalculateMinMaxDamage(), Player::CalculateQuestRewardXP(), Player::CalculateReputationGain(), Player::CalculateTalentsPoints(), SpellEffectInfo::CalcValue(), Player::CanEquipItem(), Group::CanJoinBattlegroundQueue(), Player::CanSeeStartQuest(), Player::CanUseItem(), Player::CheckAreaExploreAndOutdoor(), spell_hun_tame_beast::CheckCast(), Spell::CheckCast(), ServerMailCondition::CheckCondition(), Spell::CheckEffectTarget(), spell_gen_proc_above_75::CheckLevel(), spell_gen_proc_reduced_above_60::CheckProc(), spell_item_green_whelp_armor::CheckProc(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), CreateTamedPetFrom(), CreateTamedPetFrom(), DealMeleeDamage(), DoLowUnlearnCost(), DoMedUnlearnCost(), Spell::DoSpellHitOnUnit(), Spell::EffectAddHonor(), Spell::EffectApplyGlyph(), Spell::EffectDuel(), Spell::EffectEnergize(), Spell::EffectSchoolDMG(), Spell::EffectSkinning(), Spell::EffectTameCreature(), Pet::FillPetInfo(), lfg::LFGMgr::FinishDungeon(), Acore::XP::Gain(), Player::GetAverageItemLevel(), Player::GetAverageItemLevelForDF(), Player::GetBarberShopCost(), Player::GetBGAccessByLevel(), Pet::GetCurrentFoodBenefitLevel(), npc_wg_quest_giver::GetDialogStatus(), Player::GetDodgeFromAgility(), GetEffectiveResistChance(), SocialMgr::GetFriendInfo(), getLevelForTarget(), Creature::getLevelForTarget(), GetMaxSkillValueForLevel(), Player::GetMeleeCritFromAgility(), Pet::GetNativeObjectScale(), Player::GetQuestDialogStatus(), Player::GetQuestLevel(), Player::GetRatingMultiplier(), Creature::GetShieldBlockValue(), Player::GetSpellCritFromIntellect(), Player::GetsRecruitAFriendBonus(), Player::GetTrainerSpellState(), GetUnitMeleeSkill(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), WorldSession::HandleAcceptGrantLevel(), OutdoorPvPSI::HandleAreaTrigger(), WorldSession::HandleArenaTeamInviteOpcode(), WorldSession::HandleAuctionListItems(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), WorldSession::HandleBattlefieldStatusOpcode(), WorldSession::HandleBattlemasterJoinArena(), WorldSession::HandleBattlemasterJoinOpcode(), WorldSession::HandleCastSpellOpcode(), Player::HandleDrowning(), WorldSession::HandleGrantLevel(), WorldSession::HandleGroupInviteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLfgPlayerLockInfoRequestOpcode(), Guild::HandleMemberDepositMoney(), Guild::HandleMemberWithdrawMoney(), WorldSession::HandleMessagechatOpcode(), npc_commandscript::HandleNpcInfoCommand(), WorldSession::HandleOfferPetitionOpcode(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandlePetitionSignOpcode(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), spell_pri_divine_aegis::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), reset_commandscript::HandleResetLevelCommand(), spell_wintergrasp_portal::HandleScript(), spell_item_scroll_of_recall::HandleScript(), WorldSession::HandleSendMail(), player_settings_commandscript::HandleSettingsAnnouncerFlags(), Player::InitGlyphsForLevel(), lfg::LFGMgr::InitializeLockedDungeons(), Pet::InitLevelupSpellsForLevel(), Puppet::InitStats(), TempSummon::InitStats(), Player::InitStatsForLevel(), Pet::InitTalentForLevel(), Player::InitTaxiNodesForLevel(), Battlefield::InvitePlayerToWar(), Creature::isCanTrainingAndResetTalentsOf(), Player::isHonorOrXPTarget(), Player::IsMaxLevel(), Player::LearnDefaultSkill(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), AchievementCriteriaData::Meets(), MeleeSpellHitResult(), npc_eagle_trash_aggro_trigger::MoveInLineOfSight(), Player::OCTRegenHPPerSpirit(), Player::OCTRegenMPPerSpirit(), spell_item_with_mount_speed::OnApply(), item_generic_limit_chance_above_60::OnCastItemCombatSpell(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), go_evil_book_for_dummies::OnGossipHello(), Player::OnGossipSelect(), QuestApprenticeAnglerPlayerScript::OnPlayerCompleteQuest(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), Player::PrepareGossipMenu(), Player::Regenerate(), Player::RegenerateHealth(), Player::RemovedInsignia(), Pet::removeSpell(), Pet::resetTalents(), Player::ResurrectPlayer(), Player::RewardHonor(), Player::RewardQuest(), RewardRage(), Player::RewardReputation(), RollMeleeOutcomeAgainst(), ArenaTeam::Roster(), Player::Satisfy(), Player::SatisfyQuestLevel(), Pet::SavePetToDB(), CalendarMgr::SendCalendarEvent(), CalendarMgr::SendCalendarEventInvite(), WorldSession::SendLfgPlayerReward(), WorldSession::SendLfgRoleCheckUpdate(), Player::SendLoot(), PlayerMenu::SendQuestGiverOfferReward(), PlayerMenu::SendQuestGiverQuestDetails(), PlayerMenu::SendQuestQueryResponse(), Player::SendQuestReward(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), Player::SetRestBonus(), Guild::Member::SetStats(), SpellPctDamageModsDone(), Spell::SummonGuardian(), Player::SummonPet(), Pet::SynchronizeLevelWithOwner(), Aura::Update(), npc_pet_hunter_snake_trap::UpdateAI(), Player::UpdateAttackPowerAndDamage(), Player::UpdateCombatSkills(), Creature::UpdateEntry(), lfg::LFGMgr::UpdateRaidBrowser(), and GameObject::Use().

◆ getLevelForTarget()

◆ GetMagicHitRedirectTarget()

Unit * Unit::GetMagicHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo 
)
11106{
11107 // Patch 1.2 notes: Spell Reflection no longer reflects abilities
11108 if (spellInfo->HasAttribute(SPELL_ATTR0_IS_ABILITY) || spellInfo->HasAttribute(SPELL_ATTR1_NO_REDIRECTION) || spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES))
11109 return victim;
11110
11112 for (Unit::AuraEffectList::const_iterator itr = magnetAuras.begin(); itr != magnetAuras.end(); ++itr)
11113 {
11114 if (Unit* magnet = (*itr)->GetBase()->GetUnitOwner())
11115 if (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11116 //&& spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK
11117 && _IsValidAttackTarget(magnet, spellInfo)
11118 /*&& IsWithinLOSInMap(magnet)*/)
11119 {
11120 // Xinef: We should choose minimum between flight time and queue time as in reflect, however we dont know flight time at this point, use arbitrary small number
11121 magnet->m_Events.AddEvent(new RedirectSpellEvent(*magnet, victim->GetGUID(), *itr), magnet->m_Events.CalculateQueueTime(100));
11122
11123 if (magnet->IsTotem())
11124 {
11125 uint64 queueTime = magnet->m_Events.CalculateQueueTime(100);
11126 if (spellInfo->Speed > 0.0f)
11127 {
11128 float dist = GetDistance(magnet->GetPositionX(), magnet->GetPositionY(), magnet->GetPositionZ());
11129 if (dist < 5.0f)
11130 dist = 5.0f;
11131 queueTime = magnet->m_Events.CalculateTime((uint64)std::floor(dist / spellInfo->Speed * 1000.0f));
11132 }
11133
11134 magnet->m_Events.AddEvent(new KillMagnetEvent(*magnet), queueTime);
11135 }
11136
11137 return magnet;
11138 }
11139 }
11140 return victim;
11141}
@ SPELL_ATTR1_NO_REDIRECTION
Definition SharedDefines.h:422
@ SPELL_ATTR0_IS_ABILITY
Definition SharedDefines.h:386
@ SPELL_AURA_SPELL_MAGNET
Definition SpellAuraDefines.h:159
Definition TotemAI.h:47
Definition Unit.h:2236
bool _IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell, WorldObject const *obj=nullptr) const
Definition Unit.cpp:13967
float GetDistance(WorldObject const *obj) const
Definition Object.cpp:1238

References _IsValidAttackTarget(), SpellInfo::CheckExplicitTarget(), GetAuraEffectsByType(), WorldObject::GetDistance(), Object::GetGUID(), SpellInfo::HasAttribute(), SpellInfo::Speed, SPELL_ATTR0_IS_ABILITY, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_NO_REDIRECTION, SPELL_AURA_SPELL_MAGNET, and SPELL_CAST_OK.

Referenced by Spell::SelectExplicitTargets().

◆ GetMaxHealth()

uint32 Unit::GetMaxHealth ( ) const
inline
@ UNIT_FIELD_MAXHEALTH
Definition UpdateFields.h:104

References Object::GetUInt32Value(), and UNIT_FIELD_MAXHEALTH.

Referenced by Player::_SaveStats(), boss_twin_valkyrAI::boss_twin_valkyrAI(), boss_viscidus::boss_viscidus(), WorldSession::BuildPartyMemberStatsChangedPacket(), spell_item_skull_of_impeding_doom::CalculateDamageAmount(), CountPctFromMaxHealth(), boss_eregos::boss_eregosAI::DamageTaken(), npc_dark_fiend::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_twinemperorsAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_heated_battle::npc_heated_battleAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectHealMaxHealth(), Spell::EffectSummonPet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), Acore::XP::Gain(), GetHealthGain(), GetHealthPct(), npc_echo_of_medivh::GetPiece(), spell_illidari_council_empyreal_balance::HandleAfterCast(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), HandleAuraProc(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), spell_oculus_soar_aura::HandleEffectPeriodic(), Player::HandleFall(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcInfoCommand(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), npc_echo_of_medivh::HandlePieceJustDied(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_stinky_precious_decimate::HandleScript(), IsFullHealth(), boss_twin_valkyrAI::JustEngagedWith(), boss_sister_svalna::boss_sister_svalnaAI::JustEngagedWith(), boss_ingvar_the_plunderer::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPMissingGroupInRange::operator()(), Acore::HealthPctOrderPred::operator()(), Acore::HealthPctOrderPred::operator()(), Player::outDebugValues(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), Creature::RegenerateHealth(), Player::RegenerateHealth(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetFullHealth(), SetHealth(), boss_headless_horseman::SpellHit(), npc_necrotic_shard::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_simon_bunny::npc_simon_bunnyAI::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), boss_viscidus::SummonedCreatureDies(), boss_headless_horseman::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxNegativeAuraModifier()

int32 Unit::GetMaxNegativeAuraModifier ( AuraType  auratype) const
6037{
6038 int32 modifier = 0;
6039
6040 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6041 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6042 if ((*i)->GetAmount() < modifier)
6043 modifier = (*i)->GetAmount();
6044
6045 return modifier;
6046}

References GetAuraEffectsByType().

Referenced by AuraEffect::HandlePeriodicHealAurasTick(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxNegativeAuraModifierByAffectMask()

int32 Unit::GetMaxNegativeAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6192{
6193 int32 modifier = 0;
6194
6195 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6196 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6197 {
6198 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() < modifier)
6199 modifier = (*i)->GetAmount();
6200 }
6201
6202 return modifier;
6203}

References GetAuraEffectsByType().

◆ GetMaxNegativeAuraModifierByMiscMask()

int32 Unit::GetMaxNegativeAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6088{
6089 int32 modifier = 0;
6090
6091 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6092 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6093 {
6094 if ((*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() < modifier)
6095 modifier = (*i)->GetAmount();
6096 }
6097
6098 return modifier;
6099}

References GetAuraEffectsByType().

Referenced by SpellTakenCritChance().

◆ GetMaxNegativeAuraModifierByMiscValue()

int32 Unit::GetMaxNegativeAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6140{
6141 int32 modifier = 0;
6142
6143 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6144 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6145 {
6146 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() < modifier)
6147 modifier = (*i)->GetAmount();
6148 }
6149
6150 return modifier;
6151}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult(), and ModSpellDuration().

◆ GetMaxPositiveAuraModifier()

int32 Unit::GetMaxPositiveAuraModifier ( AuraType  auratype)
6023{
6024 int32 modifier = 0;
6025
6026 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6027 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6028 {
6029 if ((*i)->GetAmount() > modifier)
6030 modifier = (*i)->GetAmount();
6031 }
6032
6033 return modifier;
6034}

References GetAuraEffectsByType().

Referenced by CalculateSpellAmount(), AuraEffect::HandlePeriodicHealAurasTick(), Player::RewardHonor(), SpellHealingBonusTaken(), and UpdateSpeed().

◆ GetMaxPositiveAuraModifierByAffectMask()

int32 Unit::GetMaxPositiveAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6178{
6179 int32 modifier = 0;
6180
6181 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6182 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6183 {
6184 if ((*i)->IsAffectedOnSpell(affectedSpell) && (*i)->GetAmount() > modifier)
6185 modifier = (*i)->GetAmount();
6186 }
6187
6188 return modifier;
6189}

References GetAuraEffectsByType().

◆ GetMaxPositiveAuraModifierByMiscMask()

int32 Unit::GetMaxPositiveAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask,
const AuraEffect except = nullptr 
) const
6074{
6075 int32 modifier = 0;
6076
6077 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6078 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6079 {
6080 if (except != (*i) && (*i)->GetMiscValue()& misc_mask && (*i)->GetAmount() > modifier)
6081 modifier = (*i)->GetAmount();
6082 }
6083
6084 return modifier;
6085}

References GetAuraEffectsByType(), and AuraEffect::GetMiscValue().

Referenced by AuraEffect::HandleAuraModResistanceExclusive(), and SpellTakenCritChance().

◆ GetMaxPositiveAuraModifierByMiscValue()

int32 Unit::GetMaxPositiveAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6126{
6127 int32 modifier = 0;
6128
6129 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6130 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6131 {
6132 if ((*i)->GetMiscValue() == misc_value && (*i)->GetAmount() > modifier)
6133 modifier = (*i)->GetAmount();
6134 }
6135
6136 return modifier;
6137}

References GetAuraEffectsByType().

Referenced by MagicSpellHitResult().

◆ GetMaxPower()

uint32 Unit::GetMaxPower ( Powers  power) const
inline
1059{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power); }
@ UNIT_FIELD_MAXPOWER1
Definition UpdateFields.h:105

References Object::GetUInt32Value(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::_SaveStats(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_gen_replenishment_aura::CalculateAmount(), spell_item_skull_of_impeding_doom::CalculateManaLeechAmount(), Spell::CheckItems(), Player::Create(), boss_shade_of_aran::DamageTaken(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectPowerBurn(), Spell::EffectResurrect(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), GetPowerPct(), Player::GiveLevel(), HandleAuraProc(), Aura::HandleAuraSpecificMods(), HandleDummyAuraProc(), modify_commandscript::HandleModifyEnergyCommand(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_hun_ascpect_of_the_viper::HandleProc(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_kelthuzad_detonate_mana_aura::HandleScript(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), boss_curator::JustEngagedWith(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), ModifyPowerPct(), boss_shade_of_aran::OnPowerUpdate(), boss_selin_fireheart::OnPowerUpdate(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), Player::outDebugValues(), spell_item_oracle_ablutions::PrepareSpellScript(), Player::ProcessDelayedOperations(), SmartScript::ProcessEvent(), spell_bronjahm_magic_bane::RecalculateDamage(), Creature::Regenerate(), Player::Regenerate(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), SetPower(), setPowerType(), Player::SummonPet(), boss_moam::UpdateAI(), boss_faction_championsAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), Player::UpdateCharmedAI(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetMaxSkillValueForLevel()

uint16 Unit::GetMaxSkillValueForLevel ( Unit const *  target = nullptr) const
inline
1132{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }
uint8 getLevelForTarget(WorldObject const *) const override
Definition Unit.h:1027

References GetLevel(), and getLevelForTarget().

Referenced by Player::GetMaxSkillValueForLevel(), GetUnitCriticalChance(), GetWeaponSkillValue(), isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and SpellTakenCritChance().

◆ GetMechanicResistChance()

int32 Unit::GetMechanicResistChance ( SpellInfo const *  spell)
3162{
3163 if (!spell)
3164 return 0;
3165 int32 resist_mech = 0;
3166 for (uint8 eff = 0; eff < MAX_SPELL_EFFECTS; ++eff)
3167 {
3168 if (!spell->Effects[eff].IsEffect())
3169 break;
3170 int32 effect_mech = spell->GetEffectMechanic(eff);
3171 if (effect_mech)
3172 {
3174 if (resist_mech < temp)
3175 resist_mech = temp;
3176 }
3177 }
3178 return resist_mech;
3179}
@ SPELL_AURA_MOD_MECHANIC_RESISTANCE
Definition SpellAuraDefines.h:180
int32 GetTotalAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6101

References SpellInfo::Effects, SpellInfo::GetEffectMechanic(), GetTotalAuraModifierByMiscValue(), MAX_SPELL_EFFECTS, and SPELL_AURA_MOD_MECHANIC_RESISTANCE.

Referenced by MagicSpellHitResult(), and MeleeSpellHitResult().

◆ GetMeleeAttackPoint()

bool Unit::GetMeleeAttackPoint ( Unit attacker,
Position pos 
)
2698{
2699 if (!attacker)
2700 {
2701 return false;
2702 }
2703
2704 AttackerSet attackers = getAttackers();
2705
2706 if (attackers.size() <= 1) // if the attackers are not more than one
2707 {
2708 return false;
2709 }
2710
2711 float meleeReach = GetExactDist2d(attacker);
2712 if (meleeReach <= 0)
2713 {
2714 return false;
2715 }
2716
2717 float minAngle = 0;
2718 Unit *refUnit = nullptr;
2719 uint32 validAttackers = 0;
2720
2721 double attackerSize = attacker->GetCollisionRadius();
2722
2723 for (auto const& otherAttacker: attackers)
2724 {
2725 // if the otherAttacker is not valid, skip
2726 if (!otherAttacker || otherAttacker->GetGUID() == attacker->GetGUID() ||
2727 !otherAttacker->IsWithinMeleeRange(this) || otherAttacker->isMoving())
2728 {
2729 continue;
2730 }
2731
2732 float curretAngle = atan(attacker->GetExactDist2d(otherAttacker) / meleeReach);
2733 if (minAngle == 0 || curretAngle < minAngle)
2734 {
2735 minAngle = curretAngle;
2736 refUnit = otherAttacker;
2737 }
2738
2739 validAttackers++;
2740 }
2741
2742 if (!validAttackers || !refUnit)
2743 {
2744 return false;
2745 }
2746
2747 float contactDist = attackerSize + refUnit->GetCollisionRadius();
2748 float requiredAngle = atan(contactDist / meleeReach);
2749 float attackersAngle = atan(attacker->GetExactDist2d(refUnit) / meleeReach);
2750
2751 // in instance: the more attacker there are, the higher will be the tollerance
2752 // outside: creatures should not intersecate
2753 float angleTollerance = attacker->GetMap()->IsDungeon() ? requiredAngle - requiredAngle * tanh(validAttackers / 5.0f) : requiredAngle;
2754
2755 if (attackersAngle > angleTollerance)
2756 {
2757 return false;
2758 }
2759
2760 double angle = atan(contactDist / meleeReach);
2761
2762 float angularRadius = frand(0.1f, 0.3f) + angle;
2763 int8 direction = (urand(0, 1) ? -1 : 1);
2764 float currentAngle = GetAngle(refUnit);
2765 float absAngle = currentAngle + angularRadius * direction;
2766
2767 float x, y, z;
2768 float distance = meleeReach - GetObjectSize();
2769 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle);
2770
2771 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2772 {
2773 GetNearPoint(attacker, x, y, z, distance, 0.0f, absAngle * -1); // try the other side
2774
2775 if (!GetMap()->CanReachPositionAndGetValidCoords(this, x, y, z, true, true))
2776 {
2777 return false;
2778 }
2779 }
2780
2781 pos.Relocate(x, y, z);
2782
2783 return true;
2784}
std::int8_t int8
Definition Define.h:105
float frand(float min, float max)
Definition Random.cpp:57
bool IsDungeon() const
Definition Map.h:290
float GetCollisionRadius() const override
this method gets the radius of a Unit by DB if any value is defined, otherwise it gets the value by t...
Definition Unit.cpp:20957
std::unordered_set< Unit * > AttackerSet
Definition Unit.h:622
AttackerSet const & getAttackers() const
Definition Unit.h:845
void GetNearPoint(WorldObject const *searcher, float &x, float &y, float &z, float searcher_size, float distance2d, float absAngle, float controlZ=0, Position const *startPos=nullptr) const
Definition Object.cpp:2635
float GetExactDist2d(const float x, const float y) const
Definition Position.h:170

References frand(), Position::GetAngle(), getAttackers(), GetCollisionRadius(), Position::GetExactDist2d(), Object::GetGUID(), WorldObject::GetMap(), WorldObject::GetNearPoint(), WorldObject::GetObjectSize(), Map::IsDungeon(), Position::Relocate(), and urand().

Referenced by MotionMaster::MoveCircleTarget().

◆ GetMeleeCritChanceReduction()

float Unit::GetMeleeCritChanceReduction ( ) const
inline

◆ GetMeleeCritDamageReduction()

uint32 Unit::GetMeleeCritDamageReduction ( uint32  damage) const
inline
1201{ return GetCombatRatingDamageReduction(CR_CRIT_TAKEN_MELEE, 2.2f, 33.0f, damage); }
uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const
Definition Unit.cpp:19280

References CR_CRIT_TAKEN_MELEE, and GetCombatRatingDamageReduction().

Referenced by ApplyResilience(), and processDummyAuras().

◆ GetMeleeDamageReduction()

uint32 Unit::GetMeleeDamageReduction ( uint32  damage) const
inline

◆ GetMeleeDamageSchoolMask()

virtual SpellSchoolMask Unit::GetMeleeDamageSchoolMask ( WeaponAttackType  attackType = BASE_ATTACK,
uint8  damageIndex = 0 
) const
pure virtual

Implemented in Player, and Creature.

Referenced by CalculateMeleeDamage().

◆ GetMeleeHitRedirectTarget()

Unit * Unit::GetMeleeHitRedirectTarget ( Unit victim,
SpellInfo const *  spellInfo = nullptr 
)
11144{
11146 for (AuraEffectList::const_iterator i = hitTriggerAuras.begin(); i != hitTriggerAuras.end(); ++i)
11147 {
11148 if (Unit* magnet = (*i)->GetBase()->GetCaster())
11149 if (_IsValidAttackTarget(magnet, spellInfo) && magnet->IsWithinLOSInMap(this)
11150 && (!spellInfo || (spellInfo->CheckExplicitTarget(this, magnet) == SPELL_CAST_OK
11151 && spellInfo->CheckTarget(this, magnet, false) == SPELL_CAST_OK)))
11152 if (roll_chance_i((*i)->GetAmount()))
11153 {
11154 (*i)->GetBase()->DropCharge(AURA_REMOVE_BY_EXPIRE);
11155 return magnet;
11156 }
11157 }
11158 return victim;
11159}
bool roll_chance_i(int chance)
Definition Random.h:63
@ SPELL_AURA_ADD_CASTER_HIT_TRIGGER
Definition SpellAuraDefines.h:174

References _IsValidAttackTarget(), AURA_REMOVE_BY_EXPIRE, SpellInfo::CheckExplicitTarget(), SpellInfo::CheckTarget(), GetAuraEffectsByType(), roll_chance_i(), SPELL_AURA_ADD_CASTER_HIT_TRIGGER, and SPELL_CAST_OK.

Referenced by AttackerStateUpdate(), spell_dk_dancing_rune_weapon::HandleProc(), and Spell::SelectExplicitTargets().

◆ GetMeleeRange()

float Unit::GetMeleeRange ( Unit const *  target) const
684{
685 float range = GetCombatReach() + target->GetCombatReach() + 4.0f / 3.0f;
686 return std::max(range, NOMINAL_MELEE_RANGE);
687}
#define NOMINAL_MELEE_RANGE
Definition ObjectDefines.h:48
float GetCombatReach() const override
Definition Unit.h:822

References GetCombatReach(), and NOMINAL_MELEE_RANGE.

Referenced by GetRandomContactPoint(), IsWithinMeleeRange(), CreatureAI::MoveBackwardsChecks(), and SmartScript::ProcessAction().

◆ GetMeleeReach()

float Unit::GetMeleeReach ( ) const
inline
823{ float reach = m_floatValues[UNIT_FIELD_COMBATREACH]; return reach > MIN_MELEE_REACH ? reach : MIN_MELEE_REACH; }
#define MIN_MELEE_REACH
Definition ObjectDefines.h:47

References Object::m_floatValues, MIN_MELEE_REACH, and UNIT_FIELD_COMBATREACH.

Referenced by boss_veknilash::JustEngagedWith(), and npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI().

◆ GetMinionGUID()

ObjectGuid Unit::GetMinionGUID ( ) const
inline
@ UNIT_FIELD_SUMMON
Definition UpdateFields.h:87

References Object::GetGuidValue(), and UNIT_FIELD_SUMMON.

Referenced by GetFirstControlled(), GetFirstMinion(), and OutDebugInfo().

◆ GetModelForForm()

uint32 Unit::GetModelForForm ( ShapeshiftForm  form,
uint32  spellId 
)
19287{
19288 // Hardcoded cases
19289 switch (spellId)
19290 {
19291 case 7090: // Bear form
19292 return 29414;
19293 case 35200: // Roc form
19294 return 4877;
19295 default:
19296 break;
19297 }
19298
19299 if (IsPlayer())
19300 {
19301 if (uint32 ModelId = sObjectMgr->GetModelForShapeshift(form, ToPlayer()))
19302 return ModelId;
19303 }
19304
19305 uint32 modelid = 0;
19306 SpellShapeshiftFormEntry const* formEntry = sSpellShapeshiftFormStore.LookupEntry(form);
19307 if (formEntry && formEntry->modelID_A)
19308 {
19309 // Take the alliance modelid as default
19310 if (!IsPlayer())
19311 return formEntry->modelID_A;
19312 else
19313 {
19315 modelid = formEntry->modelID_A;
19316 else
19317 modelid = formEntry->modelID_H;
19318
19319 // If the player is horde but there are no values for the horde modelid - take the alliance modelid
19320 if (!modelid && Player::TeamIdForRace(getRace()) == TEAM_HORDE)
19321 modelid = formEntry->modelID_A;
19322 }
19323 }
19324
19325 return modelid;
19326}
@ TEAM_ALLIANCE
Definition SharedDefines.h:760
@ TEAM_HORDE
Definition SharedDefines.h:761
static TeamId TeamIdForRace(uint8 race)
Definition Player.cpp:5871
uint8 getRace(bool original=false) const
Definition Unit.cpp:20863
uint32 modelID_H
Definition DBCStructure.h:1828
uint32 modelID_A
Definition DBCStructure.h:1827

References getRace(), Object::IsPlayer(), SpellShapeshiftFormEntry::modelID_A, SpellShapeshiftFormEntry::modelID_H, sObjectMgr, sSpellShapeshiftFormStore, TEAM_ALLIANCE, TEAM_HORDE, Player::TeamIdForRace(), and Object::ToPlayer().

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), and RestoreDisplayId().

◆ GetModifierValue()

float Unit::GetModifierValue ( UnitMods  unitMod,
UnitModifierType  modifierType 
) const
15379{
15380 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15381 {
15382 LOG_ERROR("entities.unit", "attempt to access non-existing modifier value from UnitMods!");
15383 return 0.0f;
15384 }
15385
15386 if (modifierType == TOTAL_PCT && m_auraModifiersGroup[unitMod][modifierType] <= 0.0f)
15387 return 0.0f;
15388
15389 return m_auraModifiersGroup[unitMod][modifierType];
15390}
@ MODIFIER_TYPE_END
Definition Unit.h:131

References LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, TOTAL_PCT, and UNIT_MOD_END.

Referenced by Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectWeaponDmg(), Guardian::UpdateArmor(), Player::UpdateArmor(), Creature::UpdateAttackPowerAndDamage(), Guardian::UpdateAttackPowerAndDamage(), Player::UpdateAttackPowerAndDamage(), Guardian::UpdateDamagePhysical(), Guardian::UpdateMaxHealth(), Player::UpdateMaxHealth(), Guardian::UpdateMaxPower(), Player::UpdateMaxPower(), and Player::UpdateResistances().

◆ GetMotionMaster() [1/2]

MotionMaster * Unit::GetMotionMaster ( )
inline
1673{ return i_motionMaster; }

References i_motionMaster.

Referenced by _ExitVehicle(), HomeMovementGenerator< Creature >::_setTargetLocation(), PetAI::_stopAttack(), BattlegroundAV::AddAVCreature(), UnitAI::AttackStart(), FollowerAI::AttackStart(), boss_priestess_lackey_commonAI::AttackStart(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::AttackStart(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::AttackStart(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::AttackStart(), boss_malygos::boss_malygosAI::AttackStart(), npc_nexus_lord::npc_nexus_lordAI::AttackStart(), boss_swamplord_muselek::AttackStart(), ArcherAI::AttackStart(), npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_shade_of_aran::AttackStart(), npc_hyjal_ground_trash::AttackStart(), npc_hyjal_gargoyle::AttackStart(), npc_hyjal_frost_wyrm::AttackStart(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::AttackStart(), boss_magus_telestra::AttackStart(), boss_razorscale::boss_razorscaleAI::AttackStart(), boss_lady_malande::AttackStart(), boss_olm_the_summoner::AttackStart(), boss_kiggler_the_crazed::AttackStart(), boss_krosh_firehand::AttackStart(), npc_millhouse_manastorm::npc_millhouse_manastormAI::AttackStart(), boss_high_astromancer_solarian::AttackStart(), npc_capernian::AttackStart(), UnitAI::AttackStartCaster(), Creature::CanCreatureAttack(), boss_professor_putricide::boss_professor_putricideAI::ChangePhase(), CleanupBeforeRemoveFromMap(), boss_alar::ConstructWaypointsAndMove(), boss_isalien::DamageTaken(), boss_julianne::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_nightbane::DoAction(), npc_apothecary_genericAI::DoAction(), npc_harrison_jones::DoAction(), npc_amanishi_lookout::DoAction(), npc_chained_spirit::DoAction(), boss_anetheron::DoAction(), boss_azgalor::DoAction(), boss_kazrogal::DoAction(), boss_rage_winterchill::DoAction(), npc_hyjal_ground_trash::DoAction(), npc_hyjal_gargoyle::DoAction(), npc_hyjal_frost_wyrm::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_saurfang_event::npc_saurfang_eventAI::DoAction(), boss_professor_putricide::boss_professor_putricideAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), npc_argent_captainAI::DoAction(), npc_icc_spire_frostwyrm::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::DoAction(), npc_ahune_bunny::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_living_mojo::npc_living_mojoAI::DoAction(), npc_power_spark::npc_power_sparkAI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_skadi::boss_skadiAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_maiev_illidan::DoAction(), npc_akama_shade::DoAction(), boss_nazan::DoAction(), boss_ghazan::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), PetAI::DoAttack(), Creature::DoFleeToGetAssistance(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoStartMovement(), ScriptedAI::DoStartNoMovement(), go_commandscript::DoTeleport(), Spell::EffectCharge(), Spell::EffectChargeDest(), Spell::EffectDistract(), Spell::EffectJump(), Spell::EffectJumpDest(), Spell::EffectPullTowards(), Spell::EffectSummonType(), boss_jindo::EnterEvadeMode(), npc_black_morass_summoned_add::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), npc_argent_captainAI::EnterEvadeMode(), CreatureAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), npc_burning_spirit::npc_burning_spiritAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_mrfloppy::npc_mrfloppyAI::EnterEvadeMode(), npc_pet_gen_argent_pony_bridle::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), boss_halazzi::EnterPhase(), boss_zuljin::EnterPhase(), VehicleDespawnEvent::Execute(), RestoreAttack::Execute(), OrcMoveEvent::Execute(), NpcRunToHome::Execute(), UtherBatteredHiltEvent::Execute(), SlaveRunEvent::Execute(), DelayedMovementEvent::Execute(), DaranavanMoveEvent::Execute(), FrostwyrmLandEvent::Execute(), SACActivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), AssistanceMovementGenerator::Finalize(), npc_singularity::FindAndFollowTarget(), npc_dark_iron_guzzler::FindNextKeg(), npc_hallows_end_soh::FinishEvent(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_nightbane::FlyToClosestPreFlyWayPoint(), Creature::FocusTarget(), CreatureGroup::FormationReset(), boss_volkhan::boss_volkhanAI::GoToAnvil(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_apothecary_lingering_fumes::HandleAfterCast(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), misc_commandscript::HandleAppearCommand(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), misc_commandscript::HandleComeToMeCommand(), spell_q12589_shoot_rjr::HandleDummy(), spell_q11520_discovering_your_roots::HandleDummy(), spell_q6124_6129_apply_salve::HandleDummy(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_icc_geist_alarm::HandleEvent(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), go_commandscript::HandleGoGraveyardCommand(), go_commandscript::HandleGoGridCommand(), go_commandscript::HandleGoTicketCommand(), go_commandscript::HandleGoZoneXYCommand(), misc_commandscript::HandleGroupSummonCommand(), spell_chapter2_persuasive_strike::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), spell_item_toxic_wasteling::HandleJump(), AuraEffect::HandleModPossessPet(), misc_commandscript::HandleMovegensCommand(), WorldSession::HandleMoveTeleportAck(), WorldSession::HandleMoveWorldportAck(), npc_commandscript::HandleNpcFollowCommand(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), npc_commandscript::HandleNpcUnFollowCommand(), spell_item_enchanted_broom_periodic::HandlePeriodicTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePlayerLoginFromDB(), spell_entropius_black_hole_effect::HandlePull(), spell_boss_magus_telestra_gravity_well::HandlePull(), PetAI::HandleReturnMovement(), spell_the_lich_king_valkyr_target_search::HandleScript(), spell_ayamiss_swarmer_teleport_trigger::HandleScript(), spell_gen_ayamiss_swarmer_loop::HandleScript(), WorldSession::HandleSetRaidDifficultyOpcode(), spell_sindragosa_icy_grip_jump::HandleSpecial(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), spell_item_draenic_pale_ale::HandleSummon(), tele_commandscript::HandleTeleCommand(), tele_commandscript::HandleTeleGroupCommand(), wp_commandscript::HandleWpLoadCommand(), wp_commandscript::HandleWpUnLoadCommand(), boss_felmyst::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_lieutenant_drake::InitializeAI(), boss_glob_of_viscidus::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), boss_eck::boss_eckAI::InitializeAI(), npc_preparations_for_war_vehicle::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), Totem::InitSummon(), boss_grand_warlock_nethekurse::IntroRP(), Creature::IsFreeToMove(), IsMutualChase(), boss_gahzranka::IsSummonedBy(), boss_aeonus::IsSummonedBy(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::IsSummonedBy(), npc_burning_spirit::npc_burning_spiritAI::IsSummonedBy(), npc_demonic_vapor::IsSummonedBy(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), boss_kologarn_eyebeam::boss_kologarn_eyebeamAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::IsSummonedBy(), npc_spirit_shade::npc_spirit_shadeAI::IsSummonedBy(), Creature::IsUpdateNeeded(), JumpTo(), JumpTo(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), boss_ayamiss::JustDied(), boss_shade_of_aran::JustEngagedWith(), npc_cyclone::JustEngagedWith(), npc_sunblade_scout::JustEngagedWith(), boss_akilzon::JustEngagedWith(), npc_amanishi_scout::JustEngagedWith(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_grandmaster_vorpil::JustEngagedWith(), boss_warlord_kalithresh::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nazan::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_ayamiss::JustEngagedWith(), boss_felmyst::JustEngagedWith(), boss_janalai::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_alar::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), SmartAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), boss_ghazan::JustReachedHome(), boss_grand_warlock_nethekurse::JustReachedHome(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_auriaya::boss_auriayaAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), npc_daphne_stilwell::npc_daphne_stilwellAI::JustSummoned(), boss_mekgineer_steamrigger::JustSummoned(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_xevozz::boss_xevozzAI::JustSummoned(), npc_hor_lich_king::npc_hor_lich_kingAI::JustSummoned(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::JustSummoned(), boss_ingvar_the_plunderer::JustSummoned(), boss_vexallus::JustSummoned(), npc_kalecgos_kj::JustSummoned(), boss_janalai::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::JustSummoned(), npc_medivh_bm::JustSummoned(), boss_hadronox::boss_hadronoxAI::JustSummoned(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_akama_shade::JustSummoned(), npc_creature_generator_akama::JustSummoned(), boss_hydross_the_unstable::JustSummoned(), boss_lady_vashj::JustSummoned(), boss_mennu_the_betrayer::JustSummoned(), boss_kaelthas::JustSummoned(), boss_mechano_lord_capacitus::JustSummoned(), npc_rinji::npc_rinjiAI::JustSummoned(), npc_maghar_captive::npc_maghar_captiveAI::JustSummoned(), boss_ayamiss::JustSummoned(), Player::KillPlayer(), KnockbackFrom(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), Player::LeaveBattleground(), Creature::Motion_Initialize(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), PetAI::MovementInform(), boss_ebonroc::boss_ebonrocAI::MovementInform(), boss_nightbane::MovementInform(), npc_harrison_jones::MovementInform(), boss_bug_trio::MovementInform(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_four_horsemen::boss_four_horsemenAI::MovementInform(), npc_akama_illidan::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), npc_fel_guard_hound::npc_fel_guard_houndAI::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_cameron::MoveTheChildren(), boss_four_horsemen::boss_four_horsemenAI::MoveToCorner(), npc_janalai_hatcher::MoveToNewWaypoint(), npc_concentrated_ball::npc_concentrated_ballAI::MoveToNextPoint(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_leotheras_the_blind::MoveToTargetIfOutOfRange(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), NearTeleportTo(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_collapsing_star::npc_collapsing_starAI::npc_collapsing_starAI(), npc_frost_sphere::npc_frost_sphereAI::npc_frost_sphereAI(), npc_omen::npc_omenAI::npc_omenAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::npc_pos_after_first_bossAI(), npc_ulduar_saronite_vapors::npc_ulduar_saronite_vaporsAI::npc_ulduar_saronite_vaporsAI(), spell_halion_twilight_phasing_aura::OnApply(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_hyjal_jaina::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_kernobee::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), spell_chapter5_light_of_dawn_aura::OnRemove(), spell_halion_twilight_phasing_aura::OnRemove(), SplineHandler::operator()(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_oculus_drake::npc_oculus_drakeAI::PassengerBoarded(), npc_vics_flying_machine::npc_vics_flying_machineAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), boss_nightbane::PathEndReached(), boss_anetheron::PathEndReached(), boss_rage_winterchill::PathEndReached(), npc_hyjal_ground_trash::PathEndReached(), npc_hyjal_frost_wyrm::PathEndReached(), boss_ambassador_hellmaw::PathEndReached(), npc_akama_illidan::PathEndReached(), boss_nefarian::PathEndReached(), npc_hyjal_gargoyle::PathEndReached(), PauseMovement(), SmartAI::PausePath(), PetSpellFail(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::PickNewLocation(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), propagateSpeedChange(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), RemoveCharmedBy(), boss_the_beast::boss_thebeastAI::Reset(), boss_felblood_kaelthas::Reset(), npc_acherus_necromancer::npc_acherus_necromancerAI::Reset(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_janalai::Reset(), npc_janalai_hatcher::Reset(), boss_arlokk::boss_arlokkAI::Reset(), npc_zulian_prowler::npc_zulian_prowlerAI::Reset(), npc_batrider::Reset(), npc_brew_bubble::Reset(), boss_archimonde::Reset(), boss_ayamiss::Reset(), boss_bug_trio::Reset(), boss_jedoga_shadowseeker::Reset(), boss_taldaram::Reset(), npc_kinetic_bomb::npc_kinetic_bombAI::Reset(), npc_assembly_lightning::npc_assembly_lightningAI::Reset(), boss_kologarn::boss_kologarnAI::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_released_offspring_harkoa::npc_released_offspring_harkoaAI::Reset(), npc_voidtraveler::Reset(), boss_lady_vashj::Reset(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_infernal_attacker::npc_infernal_attackerAI::Reset(), npc_pet_gen_gnomish_flame_turret::Reset(), Creature::Respawn(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), ResumeMovement(), SmartAI::ResumePath(), Resurrect(), SmartAI::ReturnToLastOOCPos(), npc_escortAI::ReturnToLastPoint(), boss_alar::ScheduleAbilities(), boss_illidan_stormrage::ScheduleAbilities(), boss_magtheridon::ScheduleCombatEvents(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), boss_felmyst::ScheduleGroundAbilities(), boss_nightbane::ScheduleLand(), boss_laj::ScheduleTasks(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), WorldSession::SendDoFlight(), boss_sartharion::boss_sartharionAI::SendLavaWaves(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_grand_warlock_nethekurse::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), gunship_npc_AI::SetData(), npc_enslaved_proto_drake::SetData(), boss_the_beast::boss_thebeastAI::SetData(), npc_eastvale_peasent::SetData(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::SetData(), setDeathState(), Creature::setDeathState(), SetFeared(), SmartAI::SetFollow(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::SetGUID(), SetInCombatState(), Player::SetMover(), SetSpeed(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_akama_illidan::sGossipSelect(), npc_akama_shade::sGossipSelect(), boss_thorim::boss_thorimAI::SpawnAnArenaNPC(), npc_varian_wrynn::npc_varian_wrynnAI::SpawnWave(), npc_thrall_bfu::npc_thrall_bfuAI::SpawnWave(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::SpellHit(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::SpellHit(), npc_saurfang_event::npc_saurfang_eventAI::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), boss_attumen::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_forest_frog::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::SpellHit(), npc_iron_watcher::npc_iron_watcherAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_chesspiece::SpellHitTarget(), npc_pet_gen_fetch_ball::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_escortAI::Start(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), FollowerAI::StartFollow(), boss_felmyst::StartIntro(), WaypointMovementGenerator< Creature >::StartMove(), npc_stillpine_capitive::npc_stillpine_capitiveAI::StartMoving(), SmartAI::StartPath(), SmartAI::StopFollow(), SmartAI::StopPath(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_vazruden_the_herald::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), Spell::SummonGuardian(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::SummonNextWave(), Player::TeleportTo(), CreatureAI::TriggerAlert(), Pet::Update(), Update(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_gyth::boss_gythAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_cameron::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_grand_magister_rommath::npc_grand_magister_rommathAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_akilzon_eagle::UpdateAI(), npc_forest_frog::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_elder_kekek::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), npc_twilight_volunteer::UpdateAI(), npc_taldaram_flamesphere::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_pos_after_first_boss::npc_pos_after_first_bossAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_leader_second::npc_pos_leader_secondAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::UpdateAI(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_emergency_fire_bot::npc_ulduar_emergency_fire_botAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skadi_grauf::boss_skadi_graufAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_conversing_with_the_depths_trigger::npc_conversing_with_the_depths_triggerAI::UpdateAI(), npc_wintergarde_gryphon::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_venture_co_straggler::npc_venture_co_stragglerAI::UpdateAI(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_fel_guard_hound::npc_fel_guard_houndAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_pet_gen_toxic_wasteling::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_batrider::UpdateAI(), npc_concentrated_ball::npc_concentrated_ballAI::UpdateAI(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::UpdateAI(), npc_xt002_boombot::npc_xt002_boombotAI::UpdateAI(), Player::UpdateCharmedAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_jenny::UpdateFollowerAI(), npc_emily::npc_emilyAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ GetMotionMaster() [2/2]

const MotionMaster * Unit::GetMotionMaster ( ) const
inline
1674{ return i_motionMaster; }

References i_motionMaster.

◆ GetMountID()

◆ GetNativeDisplayId()

◆ GetNativeObjectScale()

virtual float Unit::GetNativeObjectScale ( ) const
inlinevirtual

Reimplemented in Creature, and Pet.

1885{ return 1.0f; }

Referenced by RecalculateObjectScale().

◆ GetNegStat()

float Unit::GetNegStat ( Stats  stat) const
inline
1006{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_NEGSTAT0.

◆ GetNextRandomRaidMemberOrPet()

Unit * Unit::GetNextRandomRaidMemberOrPet ( float  radius)
11201{
11202 Player* player = nullptr;
11203 if (IsPlayer())
11204 player = ToPlayer();
11205 // Should we enable this also for charmed units?
11206 else if (IsCreature() && IsPet())
11207 player = GetOwner()->ToPlayer();
11208
11209 if (!player)
11210 return nullptr;
11211 Group* group = player->GetGroup();
11212 // When there is no group check pet presence
11213 if (!group)
11214 {
11215 // We are pet now, return owner
11216 if (player != this)
11217 return IsWithinDistInMap(player, radius) ? player : nullptr;
11218 Unit* pet = GetGuardianPet();
11219 // No pet, no group, nothing to return
11220 if (!pet)
11221 return nullptr;
11222 // We are owner now, return pet
11223 return IsWithinDistInMap(pet, radius) ? pet : nullptr;
11224 }
11225
11226 std::vector<Unit*> nearMembers;
11227 // reserve place for players and pets because resizing vector every unit push is unefficient (vector is reallocated then)
11228 nearMembers.reserve(group->GetMembersCount() * 2);
11229
11230 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
11231 if (Player* Target = itr->GetSource())
11232 {
11233 if (Target != this && !IsWithinDistInMap(Target, radius))
11234 continue;
11235
11236 // IsHostileTo check duel and controlled by enemy
11237 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
11238 nearMembers.push_back(Target);
11239
11240 // Push player's pet to vector
11241 if (Unit* pet = Target->GetGuardianPet())
11242 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
11243 nearMembers.push_back(pet);
11244 }
11245
11246 if (nearMembers.empty())
11247 return nullptr;
11248
11249 uint32 randTarget = urand(0, nearMembers.size() - 1);
11250 return nearMembers[randTarget];
11251}
Definition GroupReference.h:27
Definition Group.h:169
uint32 GetMembersCount() const
Definition Group.h:245
GroupReference * GetFirstMember()
Definition Group.h:243
Group * GetGroup()
Definition Player.h:2483
Guardian * GetGuardianPet() const
Definition Unit.cpp:10737
bool IsWithinDistInMap(WorldObject const *obj, float dist2compare, bool is3D=true, bool useBoundingRadius=true) const
Definition Object.cpp:1314

References Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), Group::GetMembersCount(), GetOwner(), Object::IsCreature(), IsHostileTo(), IsPet(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), Object::ToPlayer(), and urand().

Referenced by HandleAuraRaidProcFromCharge(), and AuraEffect::HandleRaidProcFromChargeAuraProc().

◆ GetNpcFlags()

◆ GetOldFactionId()

uint32 Unit::GetOldFactionId ( ) const
inline
805{ return _oldFactionId; }

References _oldFactionId.

Referenced by npc_chesspiece::OnCharmed().

◆ GetOwnedAura()

Aura * Unit::GetOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
Aura except = nullptr 
) const
4817{
4818 AuraMapBounds range = m_ownedAuras.equal_range(spellId);
4819 for (AuraMap::const_iterator itr = range.first; itr != range.second; ++itr)
4820 {
4821 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask)
4822 && (!casterGUID || itr->second->GetCasterGUID() == casterGUID)
4823 && (!itemCasterGUID || itr->second->GetCastItemGUID() == itemCasterGUID)
4824 && (!except || except != itr->second))
4825 {
4826 return itr->second;
4827 }
4828 }
4829 return nullptr;
4830}
std::pair< AuraMap::const_iterator, AuraMap::const_iterator > AuraMapBounds
Definition Unit.h:626

References m_ownedAuras.

Referenced by _TryStackingOrRefreshingExistingAura().

◆ GetOwnedAuras() [1/2]

◆ GetOwnedAuras() [2/2]

AuraMap const & Unit::GetOwnedAuras ( ) const
inline
1297{ return m_ownedAuras; }

References m_ownedAuras.

◆ GetOwner()

Unit * Unit::GetOwner ( ) const
Todo:
: move this in Object class or move GetUInt32value here but keep consistency
10687{
10688 if (ObjectGuid ownerGUID = GetOwnerGUID())
10689 return ObjectAccessor::GetUnit(*this, ownerGUID);
10690
10691 return nullptr;
10692}

References GetOwnerGUID(), and ObjectAccessor::GetUnit().

Referenced by _ExitVehicle(), Acore::AnyAoETargetUnitInObjectRangeCheck::AnyAoETargetUnitInObjectRangeCheck(), ApplyDiminishingToDuration(), ApplyResilience(), TotemAI::AttackStart(), spell_dk_anti_magic_zone::CalculateAmount(), Creature::CanStartAttack(), spell_dk_blood_gorged::CheckProc(), spell_pri_mana_leech::CheckProc(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealHeal(), HostileRefMgr::deleteReferences(), npc_spring_rabbit::npc_spring_rabbitAI::DoAction(), Spell::DoAllEffectOnLaunchTarget(), Spell::DoAllEffectOnTarget(), PetAI::DoAttack(), Spell::EffectDispel(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), boss_illidari_council_memberAI::EnterEvadeMode(), GetCharmerOrOwner(), GetCombatRatingReduction(), GetNextRandomRaidMemberOrPet(), GetReactionTo(), GetSpellModOwner(), spell_warl_seduction::HandleAuraApply(), HandleAuraRaidProcFromChargeWithValue(), Aura::HandleAuraSpecificMods(), spell_sha_healing_stream_totem::HandleDummy(), spell_q12277_wintergarde_mine_explosion::HandleDummy(), spell_sha_mana_tide_totem::HandleDummy(), HandleDummyAuraProc(), spell_mount_check_aura::HandleEffectPeriodic(), spell_gen_gryphon_wyvern_mount_check::HandleEffectPeriodic(), spell_ioc_bomb_blast_criteria::HandleGameObjectDamage(), modify_commandscript::HandleModifyTalentCommand(), WorldSession::HandlePetActionHelper(), spell_warl_demonic_pact_aura::HandleProc(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_pet_dk_ebon_gargoyle::InitializeAI(), npc_pet_dk_dancing_rune_weapon::InitializeAI(), npc_pet_mage_mirror_image::InitializeAI(), IsAlwaysVisibleFor(), IsPetAura(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::JustDied(), Kill(), MagicSpellHitResult(), MeleeDamageBonusDone(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), npc_khunok_the_behemoth::npc_khunok_the_behemothAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), spell_hun_aspect_of_the_beast::OnPetApply(), Acore::MostHPMissingGroupInRange::operator()(), PetSpellFail(), RemoveFromWorld(), npc_target_dummy::npc_target_dummyAI::Reset(), npc_spring_rabbit::npc_spring_rabbitAI::Reset(), RestoreFaction(), Creature::SelectVictim(), SendPetActionFeedback(), SendPetAIReaction(), SendPetTalk(), SetHealth(), SetMaxHealth(), SetMaxPower(), SetPower(), setPowerType(), SetStunned(), SpellDamageBonusDone(), SpellHealingBonusDone(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), SpellPctDamageModsDone(), SpellPctHealingModsDone(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), npc_pet_gen_wind_rider_cub::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and UpdateAuraForGroup().

◆ GetOwnerGUID()

ObjectGuid Unit::GetOwnerGUID ( ) const
inline
@ UNIT_FIELD_SUMMONEDBY
Definition UpdateFields.h:90

References Object::GetGuidValue(), and UNIT_FIELD_SUMMONEDBY.

Referenced by Pet::AddToWorld(), npc_living_mojo::npc_living_mojoAI::AttackStart(), BuildValuesUpdate(), PetAI::CanAttack(), CanFreeMove(), CanHaveThreatList(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), DealDamage(), Spell::DoAllEffectOnTarget(), FollowMovementGenerator< T >::DoUpdate(), GetCharmerOrOwnerGUID(), GetOwner(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModInvisibilityDetect(), AuraEffect::HandleModStealth(), AuraEffect::HandleModStealthDetect(), AuraEffect::HandleModStealthLevel(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetRename(), HandleSpellClick(), Creature::HasMechanicTemplateImmunity(), Creature::IsDungeonBoss(), Creature::IsImmuneToKnockback(), isInAccessiblePlaceFor(), Kill(), Creature::LoadSpellTemplateImmunity(), Condition::Meets(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_venomhide_hatchling::OnGossipHello(), Acore::MostHPMissingGroupInRange::operator()(), PlayerOrPetCheck::operator()(), OutDebugInfo(), PetAI::ReceiveEmote(), Creature::Regenerate(), RemoveAllControlled(), RemoveEvadeAuras(), Pet::SavePetToDB(), spell_item_fetch_ball::SelectTarget(), SetMinion(), SetOwnerGUID(), SpellPctDamageModsDone(), Map::SummonCreature(), NPCStaveQuestAI::UnitIsUnfair(), Creature::Update(), and npc_pet_dk_ebon_gargoyle::UpdateAI().

◆ GetPartyMembers()

void Unit::GetPartyMembers ( std::list< Unit * > &  units)
18906{
18907 Unit* owner = GetCharmerOrOwnerOrSelf();
18908 Group* group = nullptr;
18909 if (owner->IsPlayer())
18910 group = owner->ToPlayer()->GetGroup();
18911
18912 if (group)
18913 {
18914 uint8 subgroup = owner->ToPlayer()->GetSubGroup();
18915
18916 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
18917 {
18918 Player* Target = itr->GetSource();
18919
18920 // IsHostileTo check duel and controlled by enemy
18921 if (Target && Target->IsInMap(owner) && Target->GetSubGroup() == subgroup && !IsHostileTo(Target))
18922 {
18923 if (Target->IsAlive())
18924 TagUnitMap.push_back(Target);
18925
18926 for (Unit::ControlSet::iterator iterator = Target->m_Controlled.begin(); iterator != Target->m_Controlled.end(); ++iterator)
18927 {
18928 if (Unit* pet = *iterator)
18929 if (pet->IsGuardian() && pet->IsAlive())
18930 TagUnitMap.push_back(pet);
18931 }
18932 }
18933 }
18934 }
18935 else
18936 {
18937 if (owner->IsAlive())
18938 TagUnitMap.push_back(owner);
18939
18940 for (Unit::ControlSet::iterator itr = owner->m_Controlled.begin(); itr != owner->m_Controlled.end(); ++itr)
18941 {
18942 if (Unit* pet = *itr)
18943 if (pet->IsGuardian() && pet->IsAlive())
18944 TagUnitMap.push_back(pet);
18945 }
18946 }
18947}
uint8 GetSubGroup() const
Definition Player.h:2487

References GetCharmerOrOwnerOrSelf(), Group::GetFirstMember(), Player::GetGroup(), Player::GetSubGroup(), IsAlive(), IsHostileTo(), WorldObject::IsInMap(), Object::IsPlayer(), m_Controlled, and Object::ToPlayer().

Referenced by spell_warr_improved_spell_reflection_trigger_aura::HandleRemove().

◆ GetPetGUID()

◆ GetPhaseByAuras()

uint32 Unit::GetPhaseByAuras ( ) const
19125{
19126 uint32 currentPhase = 0;
19128 if (!phases.empty())
19129 for (AuraEffectList::const_iterator itr = phases.begin(); itr != phases.end(); ++itr)
19130 currentPhase |= (*itr)->GetMiscValue();
19131
19132 return currentPhase;
19133}
@ SPELL_AURA_PHASE
Definition SpellAuraDefines.h:324

References GetAuraEffectsByType(), and SPELL_AURA_PHASE.

Referenced by Player::GetPhaseMaskForSpawn(), AuraEffect::HandlePhase(), and Player::SetGameMaster().

◆ GetPosStat()

float Unit::GetPosStat ( Stats  stat) const
inline
1005{ return GetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + stat); }

References Object::GetFloatValue(), and UNIT_FIELD_POSSTAT0.

◆ GetPower()

uint32 Unit::GetPower ( Powers  power) const
inline
1058{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_POWER1) + power); }
@ UNIT_FIELD_POWER1
Definition UpdateFields.h:97

References Object::GetUInt32Value(), and UNIT_FIELD_POWER1.

Referenced by PetAI::_canMeleeAttack(), Player::_SaveCharacter(), WorldSession::BuildPartyMemberStatsChangedPacket(), SpellInfo::CalcPowerCost(), spell_igb_cannon_blast::CalculatePower(), Creature::CanCastSpell(), Spell::CheckItems(), Spell::CheckPower(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), Spell::EffectCastButtons(), Spell::EffectWeaponDmg(), Pet::FillPetInfo(), Pet::GetHappinessState(), GetPowerPct(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), AuraEffect::HandleObsModPowerAuraTick(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetAbandon(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), spell_pal_lay_on_hands::HandleScript(), Player::InitStatsForLevel(), boss_shade_of_aran::JustEngagedWith(), npc_obsidian_destroyer::JustEngagedWith(), spell_gen_replenishment_aura::Load(), Pet::LoseHappiness(), ModifyPower(), spell_mark_of_kazrogal_aura::OnPeriodic(), spell_mark_of_kazzak_aura::OnPeriodic(), Acore::PowerPctOrderPred::operator()(), Acore::PowerPctOrderPred::operator()(), SmartScript::ProcessAction(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::Regenerate(), Player::Regenerate(), Creature::RegenerateHealth(), Player::SaveManaBeforeDuel(), Pet::SavePetToDB(), Creature::SaveToDB(), ScriptedAI::SelectSpell(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetMaxPower(), SetPower(), setPowerType(), spell_igb_incinerating_blast::StoreEnergy(), Aura::Update(), boss_moam::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), PetAI::UpdateAI(), and Player::UpdateCharmedAI().

◆ GetPowerPct()

float Unit::GetPowerPct ( Powers  power) const
inline
1060{ return GetMaxPower(power) ? 100.f * GetPower(power) / GetMaxPower(power) : 0.0f; }
uint32 GetMaxPower(Powers power) const
Definition Unit.h:1059
uint32 GetPower(Powers power) const
Definition Unit.h:1058

References GetMaxPower(), and GetPower().

Referenced by npc_obsidian_destroyer::JustEngagedWith(), npc_obsidian_eradicator::JustEngagedWith(), npc_obsidian_nullifier::JustEngagedWith(), boss_curator::JustEngagedWith(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), and boss_hazzarah::UpdateAI().

◆ getPowerType()

◆ GetPowerTypeByAuraGroup()

Powers Unit::GetPowerTypeByAuraGroup ( UnitMods  unitMod) const
15497{
15498 switch (unitMod)
15499 {
15500 case UNIT_MOD_RAGE:
15501 return POWER_RAGE;
15502 case UNIT_MOD_FOCUS:
15503 return POWER_FOCUS;
15504 case UNIT_MOD_ENERGY:
15505 return POWER_ENERGY;
15506 case UNIT_MOD_HAPPINESS:
15507 return POWER_HAPPINESS;
15508 case UNIT_MOD_RUNE:
15509 return POWER_RUNE;
15511 return POWER_RUNIC_POWER;
15512 default:
15513 case UNIT_MOD_MANA:
15514 return POWER_MANA;
15515 }
15516}
@ UNIT_MOD_RUNE
Definition Unit.h:155
@ UNIT_MOD_ENERGY
Definition Unit.h:153
@ UNIT_MOD_FOCUS
Definition Unit.h:152
@ UNIT_MOD_HAPPINESS
Definition Unit.h:154
@ UNIT_MOD_MANA
Definition Unit.h:150
@ UNIT_MOD_RAGE
Definition Unit.h:151
@ UNIT_MOD_RUNIC_POWER
Definition Unit.h:156

References POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNE, POWER_RUNIC_POWER, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RUNE, and UNIT_MOD_RUNIC_POWER.

Referenced by HandleStatModifier().

◆ GetPPMProcChance()

float Unit::GetPPMProcChance ( uint32  WeaponSpeed,
float  PPM,
SpellInfo const *  spellProto 
) const
13535{
13536 // proc per minute chance calculation
13537 if (PPM <= 0)
13538 return 0.0f;
13539
13540 // Apply chance modifer aura
13541 if (spellProto)
13542 if (Player* modOwner = GetSpellModOwner())
13543 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_PROC_PER_MINUTE, PPM);
13544
13545 return (WeaponSpeed * PPM) / 600.0f; // result is chance in percents (probability = Speed_in_sec * (PPM / 60))
13546}
@ SPELLMOD_PROC_PER_MINUTE
Definition SpellDefines.h:102

References GetSpellModOwner(), SpellInfo::Id, and SPELLMOD_PROC_PER_MINUTE.

Referenced by Player::CastItemCombatSpell(), and IsTriggeredAtSpellProcEvent().

◆ GetProcAurasTriggeredOnEvent()

void Unit::GetProcAurasTriggeredOnEvent ( std::list< AuraApplication * > &  aurasTriggeringProc,
std::list< AuraApplication * > *  procAuras,
ProcEventInfo  eventInfo 
)
16586{
16587 // use provided list of auras which can proc
16588 if (procAuras)
16589 {
16590 for (std::list<AuraApplication*>::iterator itr = procAuras->begin(); itr != procAuras->end(); ++itr)
16591 {
16592 ASSERT((*itr)->GetTarget() == this);
16593 if (!(*itr)->GetRemoveMode())
16594 if ((*itr)->GetBase()->IsProcTriggeredOnEvent(*itr, eventInfo))
16595 {
16596 (*itr)->GetBase()->PrepareProcToTrigger(*itr, eventInfo);
16597 aurasTriggeringProc.push_back(*itr);
16598 }
16599 }
16600 }
16601 // or generate one on our own
16602 else
16603 {
16604 for (AuraApplicationMap::iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16605 {
16606 if (itr->second->GetBase()->IsProcTriggeredOnEvent(itr->second, eventInfo))
16607 {
16608 itr->second->GetBase()->PrepareProcToTrigger(itr->second, eventInfo);
16609 aurasTriggeringProc.push_back(itr->second);
16610 }
16611 }
16612 }
16613}

References ASSERT, and GetAppliedAuras().

Referenced by TriggerAurasProcOnEvent().

◆ getRace()

uint8 Unit::getRace ( bool  original = false) const
20864{
20865 if (IsPlayer())
20866 {
20867 if (original)
20868 return m_realRace;
20869 else
20870 return m_race;
20871 }
20872
20874}

References Object::GetByteValue(), Object::IsPlayer(), m_race, m_realRace, and UNIT_FIELD_BYTES_0.

Referenced by Player::_LoadHomeBind(), Player::_LoadSkills(), Player::_SaveCharacter(), Player::BuildPlayerRepop(), Corpse::BuildValuesUpdate(), Player::CheckSkillLearnedBySpell(), Player::CreateCorpse(), GetModelForForm(), ObjectMgr::GetModelForShapeshift(), getRaceMask(), GetReactionTo(), Player::GetStartPosition(), Player::GetTeamId(), Player::GiveLevel(), WorldSession::HandleAlterAppearance(), AuraEffect::HandleAuraTransform(), WorldSession::HandleMirrorImageDataRequest(), modify_commandscript::HandleModifyGenderCommand(), misc_commandscript::HandlePInfoCommand(), WorldSession::HandlePlayerLoginFromDB(), reset_commandscript::HandleResetStatsOrLevelHelper(), Player::InitDisplayIds(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Player::InitTaxiNodesForLevel(), Creature::IsValidTrainerForPlayer(), Channel::KickOrBan(), Player::LearnCustomSpells(), Player::LearnDefaultSkill(), Player::LearnDefaultSkills(), Player::LoadFromDB(), AchievementCriteriaData::Meets(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnPlayerEnter(), InstanceScript::OnPlayerLeave(), RestoreFaction(), Player::RewardHonor(), WorldSession::SendNameQueryOpcode(), Player::SetGameMaster(), Player::StoreNewItemInBestSlots(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSkillsForLevel().

◆ getRaceMask()

◆ GetRandomContactPoint()

bool Unit::GetRandomContactPoint ( Unit const *  target,
float &  x,
float &  y,
float &  z,
bool  force = false 
) const
715{
716 float combat_reach = GetCombatReach();
717 if (combat_reach < 0.1f) // sometimes bugged for players
718 combat_reach = DEFAULT_COMBAT_REACH;
719
720 uint32 attacker_number = getAttackers().size();
721 if (attacker_number > 0)
722 --attacker_number;
723 Creature const* c = obj->ToCreature();
724 if (c)
725 if (c->isWorldBoss() || c->IsDungeonBoss() || (obj->IsPet() && const_cast<Unit*>(obj)->ToPet()->isControlled()))
726 attacker_number = 0; // pussywizard: pets and bosses just come to target from their angle
727
728 GetNearPoint(obj, x, y, z, isMoving() ? (obj->GetCombatReach() > 7.75f ? obj->GetCombatReach() - 7.5f : 0.25f) : obj->GetCombatReach(), 0.0f,
729 GetAngle(obj) + (attacker_number ? (static_cast<float>(M_PI / 2) - static_cast<float>(M_PI) * (float)rand_norm()) * float(attacker_number) / combat_reach * 0.3f : 0));
730
731 // pussywizard
732 if (std::fabs(this->GetPositionZ() - z) > this->GetCollisionHeight() || !IsWithinLOS(x, y, z))
733 {
734 x = this->GetPositionX();
735 y = this->GetPositionY();
736 z = this->GetPositionZ();
737 obj->UpdateAllowedPositionZ(x, y, z);
738 }
739 float maxDist = GetMeleeRange(obj);
740 if (GetExactDistSq(x, y, z) >= maxDist * maxDist)
741 {
742 if (force)
743 {
744 x = this->GetPositionX();
745 y = this->GetPositionY();
746 z = this->GetPositionZ();
747 return true;
748 }
749 return false;
750 }
751 return true;
752}
#define DEFAULT_COMBAT_REACH
Definition ObjectDefines.h:46
bool IsDungeonBoss() const
Definition Creature.cpp:3179
bool isControlled() const
Definition Pet.h:54
float GetCollisionHeight() const override
Return collision height sent to client.
Definition Unit.cpp:20963
float GetMeleeRange(Unit const *target) const
Definition Unit.cpp:683
bool IsWithinLOS(float x, float y, float z, VMAP::ModelIgnoreFlags ignoreFlags=VMAP::ModelIgnoreFlags::Nothing, LineOfSightChecks checks=LINEOFSIGHT_ALL_CHECKS) const
Definition Object.cpp:1319
float GetExactDistSq(float x, float y, float z) const
Definition Position.h:174

References DEFAULT_COMBAT_REACH, Position::GetAngle(), getAttackers(), GetCollisionHeight(), GetCombatReach(), Position::GetExactDistSq(), GetMeleeRange(), WorldObject::GetNearPoint(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Pet::isControlled(), Creature::IsDungeonBoss(), isMoving(), IsPet(), WorldObject::IsWithinLOS(), Creature::isWorldBoss(), rand_norm(), Object::ToCreature(), ToPet(), and WorldObject::UpdateAllowedPositionZ().

Referenced by boss_bug_trio::DamageTaken(), and boss_bug_trio::DoFinalSpell().

◆ GetRangedCritChanceReduction()

float Unit::GetRangedCritChanceReduction ( ) const
inline

◆ GetRangedCritDamageReduction()

uint32 Unit::GetRangedCritDamageReduction ( uint32  damage) const
inline

◆ GetRangedDamageReduction()

uint32 Unit::GetRangedDamageReduction ( uint32  damage) const
inline

◆ GetReactionTo()

ReputationRank Unit::GetReactionTo ( Unit const *  target,
bool  checkOriginalFaction = false 
) const
10126{
10127 // always friendly to self
10128 if (this == target)
10129 return REP_FRIENDLY;
10130
10131 // always friendly to charmer or owner
10133 return REP_FRIENDLY;
10134
10135 Player const* selfPlayerOwner = GetAffectingPlayer();
10136 Player const* targetPlayerOwner = target->GetAffectingPlayer();
10137
10138 // check forced reputation to support SPELL_AURA_FORCE_REACTION
10139 if (selfPlayerOwner)
10140 {
10141 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10142 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10143 return *repRank;
10144 }
10145 else if (targetPlayerOwner)
10146 {
10147 if (FactionTemplateEntry const* selfFactionTemplateEntry = GetFactionTemplateEntry())
10148 if (ReputationRank const* repRank = targetPlayerOwner->GetReputationMgr().GetForcedRankIfAny(selfFactionTemplateEntry))
10149 return *repRank;
10150 }
10151
10153 {
10154 if (target->HasUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED))
10155 {
10156 if (selfPlayerOwner && targetPlayerOwner)
10157 {
10158 // always friendly to other unit controlled by player, or to the player himself
10159 if (selfPlayerOwner == targetPlayerOwner)
10160 return REP_FRIENDLY;
10161
10162 // duel - always hostile to opponent
10163 if (selfPlayerOwner->duel && selfPlayerOwner->duel->Opponent == targetPlayerOwner && selfPlayerOwner->duel->State == DUEL_STATE_IN_PROGRESS)
10164 return REP_HOSTILE;
10165
10166 // same group - checks dependant only on our faction - skip FFA_PVP for example
10167 if (selfPlayerOwner->IsInRaidWith(targetPlayerOwner))
10168 return REP_FRIENDLY; // return true to allow config option AllowTwoSide.Interaction.Group to work
10169 // however client seems to allow mixed group parties, because in 13850 client it works like:
10170 // return GetFactionReactionTo(GetFactionTemplateEntry(), target);
10171 }
10172
10173 // check FFA_PVP
10174 if (IsFFAPvP() && target->IsFFAPvP())
10175 return REP_HOSTILE;
10176
10177 if (selfPlayerOwner)
10178 {
10179 if (FactionTemplateEntry const* targetFactionTemplateEntry = target->GetFactionTemplateEntry())
10180 {
10181 if (ReputationRank const* repRank = selfPlayerOwner->GetReputationMgr().GetForcedRankIfAny(targetFactionTemplateEntry))
10182 return *repRank;
10183 if (!selfPlayerOwner->HasUnitFlag2(UNIT_FLAG2_IGNORE_REPUTATION))
10184 {
10185 if (FactionEntry const* targetFactionEntry = sFactionStore.LookupEntry(targetFactionTemplateEntry->faction))
10186 {
10187 if (targetFactionEntry->CanHaveReputation())
10188 {
10189 // check contested flags
10190 if (targetFactionTemplateEntry->factionFlags & FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS
10191 && selfPlayerOwner->HasPlayerFlag(PLAYER_FLAGS_CONTESTED_PVP))
10192 return REP_HOSTILE;
10193
10194 // if faction has reputation, hostile state depends only from AtWar state
10195 if (selfPlayerOwner->GetReputationMgr().IsAtWar(targetFactionEntry))
10196 return REP_HOSTILE;
10197 return REP_FRIENDLY;
10198 }
10199 }
10200 }
10201 }
10202 }
10203 }
10204 }
10205
10206 ReputationRank repRank = REP_HATED;
10207 if (!sScriptMgr->IfNormalReaction(this, target, repRank))
10208 {
10209 return ReputationRank(repRank);
10210 }
10211
10212 FactionTemplateEntry const* factionTemplateEntry = nullptr;
10213 if (checkOriginalFaction)
10214 {
10215 if (IsPlayer())
10216 {
10217 if (ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(getRace()))
10218 {
10219 factionTemplateEntry = sFactionTemplateStore.LookupEntry(rEntry->FactionID);
10220 }
10221 }
10222 else
10223 {
10224 Unit* owner = GetOwner();
10225 if (HasUnitTypeMask(UNIT_MASK_MINION) && owner)
10226 {
10227 factionTemplateEntry = sFactionTemplateStore.LookupEntry(owner->GetFaction());
10228 }
10229 else if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate())
10230 {
10231 factionTemplateEntry = sFactionTemplateStore.LookupEntry(cinfo->faction);
10232 }
10233 }
10234 }
10235
10236 if (!factionTemplateEntry)
10237 {
10238 factionTemplateEntry = GetFactionTemplateEntry();
10239 }
10240
10241 // do checks dependant only on our faction
10242 return GetFactionReactionTo(factionTemplateEntry, target);
10243}
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
@ REP_HATED
Definition SharedDefines.h:180
bool HasPlayerFlag(PlayerFlags flags) const
Definition Player.h:1127
bool IsAtWar(uint32 faction_id) const
Definition ReputationMgr.cpp:55
ReputationRank GetFactionReactionTo(FactionTemplateEntry const *factionTemplateEntry, Unit const *target) const
Definition Unit.cpp:10245
bool IsInRaidWith(Unit const *unit) const
Definition Unit.cpp:18883
Definition DBCStructure.h:679

References Player::duel, DUEL_STATE_IN_PROGRESS, FACTION_TEMPLATE_FLAG_ATTACK_PVP_ACTIVE_PLAYERS, GetAffectingPlayer(), GetCharmerOrOwnerOrSelf(), GetFaction(), GetFactionReactionTo(), GetFactionTemplateEntry(), ReputationMgr::GetForcedRankIfAny(), GetOwner(), getRace(), Player::GetReputationMgr(), Player::HasPlayerFlag(), HasUnitFlag(), HasUnitFlag2(), HasUnitTypeMask(), ReputationMgr::IsAtWar(), IsFFAPvP(), IsInRaidWith(), Object::IsPlayer(), PLAYER_FLAGS_CONTESTED_PVP, REP_FRIENDLY, REP_HATED, REP_HOSTILE, sChrRacesStore, sFactionStore, sFactionTemplateStore, sScriptMgr, Object::ToCreature(), UNIT_FLAG2_IGNORE_REPUTATION, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_MINION.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), GetDispellableAuraList(), Player::GetNPCIfCanInteractWith(), IsFriendlyTo(), IsHostileTo(), and Condition::Meets().

◆ GetRedirectThreatPercent()

uint32 Unit::GetRedirectThreatPercent ( )
inline
uint32 GetThreatPct() const
Definition ThreatMgr.h:299

References _redirectThreatInfo, and RedirectThreatInfo::GetThreatPct().

Referenced by ThreatMgr::DoAddThreat().

◆ GetRedirectThreatTarget()

Unit * Unit::GetRedirectThreatTarget ( ) const

◆ GetResistance() [1/2]

uint32 Unit::GetResistance ( SpellSchoolMask  mask) const
20171{
20172 int32 resist = -1;
20173 for (int i = SPELL_SCHOOL_NORMAL; i < MAX_SPELL_SCHOOL; ++i)
20174 if (mask & (1 << i) && (resist < 0 || resist > int32(GetResistance(SpellSchools(i)))))
20175 resist = int32(GetResistance(SpellSchools(i)));
20176
20177 // resist value will never be negative here
20178 return uint32(resist);
20179}

References GetResistance(), MAX_SPELL_SCHOOL, and SPELL_SCHOOL_NORMAL.

Referenced by Player::_SaveStats(), GetArmor(), GetEffectiveResistChance(), GetResistance(), and Player::outDebugValues().

◆ GetResistance() [2/2]

uint32 Unit::GetResistance ( SpellSchools  school) const
inline
1121{ return GetUInt32Value(static_cast<uint16>(UNIT_FIELD_RESISTANCES) + school); }
@ UNIT_FIELD_RESISTANCES
Definition UpdateFields.h:156

References Object::GetUInt32Value(), and UNIT_FIELD_RESISTANCES.

◆ GetResistanceBuffMods()

float Unit::GetResistanceBuffMods ( SpellSchools  school,
bool  positive 
) const
inline

◆ GetShapeshiftForm()

◆ GetSharedVisionList()

◆ GetSheath()

SheathState Unit::GetSheath ( ) const
inline
SheathState
Definition UnitDefines.h:125

References Object::GetByteValue(), and UNIT_FIELD_BYTES_2.

◆ GetShieldBlockValue() [1/2]

virtual uint32 Unit::GetShieldBlockValue ( ) const
pure virtual

◆ GetShieldBlockValue() [2/2]

uint32 Unit::GetShieldBlockValue ( uint32  soft_cap,
uint32  hard_cap 
) const
inline
1100 {
1101 uint32 value = GetShieldBlockValue();
1102 if (value >= hard_cap)
1103 {
1104 value = (soft_cap + hard_cap) / 2;
1105 }
1106 else if (value > soft_cap)
1107 {
1108 value = soft_cap + ((value - soft_cap) / 2);
1109 }
1110
1111 return value;
1112 }

References GetShieldBlockValue().

◆ GetSingleCastAuras() [1/2]

AuraList & Unit::GetSingleCastAuras ( )
inline

◆ GetSingleCastAuras() [2/2]

AuraList const & Unit::GetSingleCastAuras ( ) const
inline
1353{ return m_scAuras; }

References m_scAuras.

◆ GetSpeed()

float Unit::GetSpeed ( UnitMoveType  mtype) const

◆ GetSpeedRate()

◆ GetSpellCritChanceReduction()

float Unit::GetSpellCritChanceReduction ( ) const
inline

◆ GetSpellCritDamageReduction()

◆ GetSpellDamageReduction()

uint32 Unit::GetSpellDamageReduction ( uint32  damage) const
inline

◆ GetSpellMaxRangeForTarget()

float Unit::GetSpellMaxRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15238{
15239 if (!spellInfo->RangeEntry)
15240 {
15241 return 0;
15242 }
15243
15244 if (spellInfo->RangeEntry->RangeMax[1] == spellInfo->RangeEntry->RangeMax[0])
15245 {
15246 return spellInfo->GetMaxRange();
15247 }
15248
15249 if (!target)
15250 {
15251 return spellInfo->GetMaxRange(true);
15252 }
15253
15254 return spellInfo->GetMaxRange(!IsHostileTo(target));
15255}

References SpellInfo::GetMaxRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMax.

Referenced by spell_sha_fire_nova::CheckFireTotem(), Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), ScriptedAI::SelectSpell(), GameObject::TriggeringLinkedGameObject(), and Pet::Update().

◆ GetSpellMinRangeForTarget()

float Unit::GetSpellMinRangeForTarget ( Unit const *  target,
SpellInfo const *  spellInfo 
) const
15258{
15259 if (!spellInfo->RangeEntry)
15260 {
15261 return 0;
15262 }
15263
15264 if (spellInfo->RangeEntry->RangeMin[1] == spellInfo->RangeEntry->RangeMin[0])
15265 {
15266 return spellInfo->GetMinRange();
15267 }
15268
15269 return spellInfo->GetMinRange(!IsHostileTo(target));
15270}

References SpellInfo::GetMinRange(), IsHostileTo(), SpellInfo::RangeEntry, and SpellRangeEntry::RangeMin.

Referenced by Spell::CheckRange(), SpellTargetSelector::operator()(), SmartScript::ProcessAction(), and ScriptedAI::SelectSpell().

◆ GetSpellModOwner()

Player * Unit::GetSpellModOwner ( ) const
16650{
16651 if (Player* player = const_cast<Unit*>(this)->ToPlayer())
16652 {
16653 return player;
16654 }
16655
16656 if (Unit* owner = GetOwner())
16657 {
16658 if (Player* player = owner->ToPlayer())
16659 {
16660 return player;
16661 }
16662 }
16663
16664 // Special handling for Eye of Kilrogg
16666 {
16667 if (TempSummon const* tempSummon = ToTempSummon())
16668 {
16669 if (Unit* summoner = tempSummon->GetSummonerUnit())
16670 {
16671 return summoner->ToPlayer();
16672 }
16673 }
16674 }
16675
16676 return nullptr;
16677}
@ NPC_EYE_OF_KILROGG
Definition PetDefines.h:101
Definition TemporarySummon.h:40

References Object::GetEntry(), GetOwner(), NPC_EYE_OF_KILROGG, Object::ToPlayer(), and ToTempSummon().

Referenced by Spell::_cast(), Creature::AddSpellCooldown(), ApplyEffectModifiers(), CalcArmorReducedDamage(), SpellEffectInfo::CalcDamageMultiplier(), Aura::CalcDispelChance(), Aura::CalcMaxCharges(), Aura::CalcMaxDuration(), AuraEffect::CalcPeriodicCritChance(), SpellInfo::CalcPowerCost(), Aura::CalcProcChance(), SpellEffectInfo::CalcRadius(), ThreatCalcHelper::calcThreat(), spell_dru_brambles_treant::CalculateAmount(), AuraEffect::CalculatePeriodic(), CalculateSpellDamageTaken(), SpellEffectInfo::CalcValueMultiplier(), Spell::cancel(), Spell::cast(), Spell::CheckRange(), Spell::CheckRuneCost(), Spell::EffectSummonPet(), Spell::EffectSummonType(), Spell::finish(), GetEffectiveResistChance(), SpellInfo::GetMaxRange(), GetPPMProcChance(), Spell::handle_delayed(), Spell::handle_immediate(), IsAlwaysDetectableFor(), SpellInfo::IsStrongerAuraActive(), IsTriggeredAtSpellProcEvent(), MagicSpellHitResult(), MeleeDamageBonusDone(), MeleeSpellMissChance(), ModSpellCastTime(), Spell::SelectImplicitChainTargets(), Aura::SetDuration(), SpellCriticalDamageBonus(), SpellCriticalHealingBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), SpellHealingBonusDone(), SpellHealingBonusTaken(), Spell::SummonGuardian(), Spell::TakePower(), Spell::TakeRunePower(), Spell::UpdateChanneledTargetList(), and Aura::UpdateOwner().

◆ GetSpellSchoolByAuraGroup()

SpellSchools Unit::GetSpellSchoolByAuraGroup ( UnitMods  unitMod) const
15436{
15438
15439 switch (unitMod)
15440 {
15442 school = SPELL_SCHOOL_HOLY;
15443 break;
15445 school = SPELL_SCHOOL_FIRE;
15446 break;
15448 school = SPELL_SCHOOL_NATURE;
15449 break;
15451 school = SPELL_SCHOOL_FROST;
15452 break;
15454 school = SPELL_SCHOOL_SHADOW;
15455 break;
15457 school = SPELL_SCHOOL_ARCANE;
15458 break;
15459
15460 default:
15461 break;
15462 }
15463
15464 return school;
15465}
@ SPELL_SCHOOL_SHADOW
Definition SharedDefines.h:288
@ SPELL_SCHOOL_NATURE
Definition SharedDefines.h:286
@ SPELL_SCHOOL_FROST
Definition SharedDefines.h:287
@ SPELL_SCHOOL_ARCANE
Definition SharedDefines.h:289
@ SPELL_SCHOOL_FIRE
Definition SharedDefines.h:285
@ SPELL_SCHOOL_HOLY
Definition SharedDefines.h:284
@ UNIT_MOD_RESISTANCE_SHADOW
Definition Unit.h:162
@ UNIT_MOD_RESISTANCE_FROST
Definition Unit.h:161
@ UNIT_MOD_RESISTANCE_HOLY
Definition Unit.h:158
@ UNIT_MOD_RESISTANCE_ARCANE
Definition Unit.h:163
@ UNIT_MOD_RESISTANCE_FIRE
Definition Unit.h:159
@ UNIT_MOD_RESISTANCE_NATURE
Definition Unit.h:160

References SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, and UNIT_MOD_RESISTANCE_SHADOW.

Referenced by HandleStatModifier().

◆ getStandState()

◆ GetStat()

◆ GetStatByAuraGroup()

Stats Unit::GetStatByAuraGroup ( UnitMods  unitMod) const
15468{
15469 Stats stat = STAT_STRENGTH;
15470
15471 switch (unitMod)
15472 {
15474 stat = STAT_STRENGTH;
15475 break;
15477 stat = STAT_AGILITY;
15478 break;
15480 stat = STAT_STAMINA;
15481 break;
15483 stat = STAT_INTELLECT;
15484 break;
15486 stat = STAT_SPIRIT;
15487 break;
15488
15489 default:
15490 break;
15491 }
15492
15493 return stat;
15494}
Stats
Definition SharedDefines.h:257
@ STAT_SPIRIT
Definition SharedDefines.h:262
@ STAT_INTELLECT
Definition SharedDefines.h:261
@ STAT_AGILITY
Definition SharedDefines.h:259
@ STAT_STRENGTH
Definition SharedDefines.h:258
@ STAT_STAMINA
Definition SharedDefines.h:260
@ UNIT_MOD_STAT_INTELLECT
Definition Unit.h:147
@ UNIT_MOD_STAT_SPIRIT
Definition Unit.h:148
@ UNIT_MOD_STAT_STRENGTH
Definition Unit.h:144
@ UNIT_MOD_STAT_AGILITY
Definition Unit.h:145
@ UNIT_MOD_STAT_STAMINA
Definition Unit.h:146

References STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STAMINA, STAT_STRENGTH, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, and UNIT_MOD_STAT_STRENGTH.

Referenced by HandleStatModifier().

◆ GetTarget()

◆ GetThreatMgr() [1/2]

ThreatMgr & Unit::GetThreatMgr ( )
inline
898{ return m_ThreatMgr; }

References m_ThreatMgr.

Referenced by CreatureAI::_EnterEvadeMode(), npc_vengeful_shade::npc_vengeful_shadeAI::AttackStart(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_mor_grayhoof::CastRandomSpell(), CleanupBeforeRemoveFromMap(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), npc_magister_aledis::DamageTaken(), boss_ysondre::boss_ysondreAI::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), ScriptedAI::DoAddThreat(), UnitAI::DoCastToAllHostilePlayers(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ScriptedAI::DoGetThreat(), ScriptedAI::DoModifyThreatByPercent(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), ScriptedAI::DoResetThreat(), ScriptedAI::DoResetThreatList(), Spell::EffectModifyThreatPercent(), Spell::EffectTaunt(), boss_faction_championsAI::EnemiesInRange(), boss_ragnaros::boss_ragnarosAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), boss_murmur::EnterEvadeMode(), boss_alar::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_varian_wrynn::npc_varian_wrynnAI::EnterEvadeMode(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), boss_ouro::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), violet_hold_trashAI::EnterEvadeMode(), npc_pet_hunter_snake_trap::EnterEvadeMode(), npc_escortAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), TemporaryThreatModifierEvent::Execute(), StartMovementEvent::Execute(), boss_supremus::FindHatefulStrikeTarget(), npc_raging_flames::FixateRandomTarget(), SmartScript::GetTargets(), UnitAI::GetThreatMgr(), debug_commandscript::HandleDebugThreatListCommand(), spell_karazhan_blink::HandleDummy(), spell_kaelthas_mind_control::HandleEffect(), spell_tharon_ja_dummy_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_enveloping_webs::HandleOnHit(), spell_arcane_vacuum::HandleOnHit(), HandleProcTriggerSpell(), PetAI::HandleReturnMovement(), spell_pursue::HandleScript(), spell_gurtogg_eject::HandleScriptEffect(), spell_leotheras_whirlwind::HandleScriptEffect(), boss_attumen::IsSummonedBy(), boss_talon_king_ikiss::JustEngagedWith(), boss_blackheart_the_inciter::JustEngagedWith(), boss_teron_gorefiend::JustEngagedWith(), boss_jindo::JustSummoned(), Kill(), boss_urom::boss_uromAI::LeaveCombat(), Creature::ModifyThreatPercentTemp(), boss_bug_trio::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), NonTankTargetSelector::operator()(), PowerUsersSelector::operator()(), MalleableGooSelector::operator()(), StoneGripTargetSelector::operator()(), boss_jeklik::PathEndReached(), SmartScript::ProcessAction(), SmartScript::ProcessEvent(), boss_priestess_lackey_commonAI::RecalculateThreat(), boss_faction_championsAI::RecalculateThreat(), boss_talon_king_ikiss::Reset(), boss_faction_championsAI::SelectEnemyCaster(), npc_scholomance_occultist::npc_scholomance_occultistAI::SelectUnitCasting(), SendChangeCurrentVictimOpcode(), SendThreatListUpdate(), setDeathState(), SetPhaseMask(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), boss_ouro::SpellHitTarget(), spell_putricide_ooze_channel::StartAttack(), BossAI::TeleportCheaters(), Creature::Update(), Update(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_nefarian::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_sartura::UpdateAI(), npc_sartura_royal_guard::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_frozen_orb::npc_frozen_orbAI::UpdateAI(), boss_the_lurker_below::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), boss_netherspite::UpdatePortals(), and CreatureAI::UpdateVictim().

◆ GetThreatMgr() [2/2]

ThreatMgr const & Unit::GetThreatMgr ( ) const
inline
899{ return m_ThreatMgr; }

References m_ThreatMgr.

◆ GetTotalAttackPowerValue()

float Unit::GetTotalAttackPowerValue ( WeaponAttackType  attType,
Unit pVictim = nullptr 
) const
15519{
15520 if (attType == RANGED_ATTACK)
15521 {
15523 if (victim)
15524 ap += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
15525
15526 if (ap < 0)
15527 return 0.0f;
15529 }
15530 else
15531 {
15533 if (victim)
15534 ap += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
15535
15536 if (ap < 0)
15537 return 0.0f;
15539 }
15540}
@ SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:190
@ SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS
Definition SpellAuraDefines.h:228
@ UNIT_FIELD_ATTACK_POWER_MODS
Definition UpdateFields.h:163
@ UNIT_FIELD_RANGED_ATTACK_POWER
Definition UpdateFields.h:165
@ UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:167
@ UNIT_FIELD_ATTACK_POWER_MULTIPLIER
Definition UpdateFields.h:164
@ UNIT_FIELD_ATTACK_POWER
Definition UpdateFields.h:162
@ UNIT_FIELD_RANGED_ATTACK_POWER_MODS
Definition UpdateFields.h:166
int32 GetInt32Value(uint16 index) const
Definition Object.cpp:299

References Object::GetFloatValue(), Object::GetInt32Value(), GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, UNIT_FIELD_ATTACK_POWER, UNIT_FIELD_ATTACK_POWER_MODS, UNIT_FIELD_ATTACK_POWER_MULTIPLIER, UNIT_FIELD_RANGED_ATTACK_POWER, UNIT_FIELD_RANGED_ATTACK_POWER_MODS, and UNIT_FIELD_RANGED_ATTACK_POWER_MULTIPLIER.

Referenced by spell_dk_ghoul_thrash::CalcDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_execute::HandleEffect(), spell_pal_seal_of_righteousness::HandleProc(), HandleProcTriggerSpell(), Spell::HandleThreatSpells(), Guardian::InitStatsForLevel(), SpellBaseDamageBonusDone(), SpellBaseHealingBonusDone(), SpellDamageBonusDone(), SpellHealingBonusDone(), Guardian::UpdateDamagePhysical(), and lfg::LFGMgr::UpdateRaidBrowser().

◆ GetTotalAuraModifier()

◆ GetTotalAuraModifierAreaExclusive()

int32 Unit::GetTotalAuraModifierAreaExclusive ( AuraType  auratype) const
5978{
5979 int32 modifier = 0;
5980 int32 areaModifier = 0;
5981
5982 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5983 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5984 {
5985 if ((*i)->GetSpellInfo()->HasAreaAuraEffect())
5986 {
5987 if (areaModifier < (*i)->GetAmount())
5988 areaModifier = (*i)->GetAmount();
5989 }
5990 else
5991 modifier += (*i)->GetAmount();
5992 }
5993
5994 return modifier + areaModifier;
5995}

References GetAuraEffectsByType().

Referenced by Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByAffectMask()

int32 Unit::GetTotalAuraModifierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6154{
6155 int32 modifier = 0;
6156
6157 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6158 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6159 if ((*i)->IsAffectedOnSpell(affectedSpell))
6160 modifier += (*i)->GetAmount();
6161
6162 return modifier;
6163}

References GetAuraEffectsByType().

◆ GetTotalAuraModifierByMiscMask()

int32 Unit::GetTotalAuraModifierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6049{
6050 int32 modifier = 0;
6051
6052 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6053 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6054 {
6055 if ((*i)->GetMiscValue()& misc_mask)
6056 modifier += (*i)->GetAmount();
6057 }
6058 return modifier;
6059}

References GetAuraEffectsByType().

Referenced by CalcArmorReducedDamage(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), GetEffectiveResistChance(), MagicSpellHitResult(), SpellCriticalDamageBonus(), SpellDamageBonusDone(), SpellDoneCritChance(), and Player::UpdateSpellCritChance().

◆ GetTotalAuraModifierByMiscValue()

int32 Unit::GetTotalAuraModifierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6102{
6103 int32 modifier = 0;
6104
6105 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6106 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6107 if ((*i)->GetMiscValue() == misc_value)
6108 modifier += (*i)->GetAmount();
6109
6110 return modifier;
6111}

References GetAuraEffectsByType().

Referenced by Player::CalculateReputationGain(), GetMechanicResistChance(), MeleeSpellHitResult(), ModSpellDuration(), Creature::Regenerate(), Player::Regenerate(), RollMeleeOutcomeAgainst(), Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalAuraModValue()

float Unit::GetTotalAuraModValue ( UnitMods  unitMod) const
15409{
15410 if (unitMod >= UNIT_MOD_END)
15411 {
15412 LOG_ERROR("entities.unit", "attempt to access non-existing UnitMods in GetTotalAuraModValue()!");
15413 return 0.0f;
15414 }
15415
15416 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15417 return 0.0f;
15418
15419 float value = m_auraModifiersGroup[unitMod][BASE_VALUE];
15420 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15421 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE];
15422 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15423
15424 return value;
15425}

References BASE_PCT, BASE_VALUE, LOG_ERROR, m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_END.

Referenced by Creature::UpdateArmor(), Creature::UpdateMaxHealth(), Creature::UpdateMaxPower(), and Creature::UpdateResistances().

◆ GetTotalAuraMultiplier()

float Unit::GetTotalAuraMultiplier ( AuraType  auratype) const
6012{
6013 float multiplier = 1.0f;
6014
6015 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6016 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6017 AddPct(multiplier, (*i)->GetAmount());
6018
6019 return multiplier;
6020}

References AddPct(), and GetAuraEffectsByType().

Referenced by MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), SpellCriticalHealingBonus(), and UpdateSpeed().

◆ GetTotalAuraMultiplierByAffectMask()

float Unit::GetTotalAuraMultiplierByAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
6166{
6167 float multiplier = 1.0f;
6168
6169 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6170 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6171 if ((*i)->IsAffectedOnSpell(affectedSpell))
6172 AddPct(multiplier, (*i)->GetAmount());
6173
6174 return multiplier;
6175}

References AddPct(), and GetAuraEffectsByType().

◆ GetTotalAuraMultiplierByMiscMask()

float Unit::GetTotalAuraMultiplierByMiscMask ( AuraType  auratype,
uint32  misc_mask 
) const
6062{
6063 float multiplier = 1.0f;
6064
6065 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6066 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6067 if (((*i)->GetMiscValue() & misc_mask))
6068 AddPct(multiplier, (*i)->GetAmount());
6069
6070 return multiplier;
6071}

References AddPct(), and GetAuraEffectsByType().

Referenced by CalculateAOEDamageReduction(), CalculateMeleeDamage(), MeleeDamageBonusTaken(), and SpellCriticalHealingBonus().

◆ GetTotalAuraMultiplierByMiscValue()

float Unit::GetTotalAuraMultiplierByMiscValue ( AuraType  auratype,
int32  misc_value 
) const
6114{
6115 float multiplier = 1.0f;
6116
6117 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
6118 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
6119 if ((*i)->GetMiscValue() == misc_value)
6120 AddPct(multiplier, (*i)->GetAmount());
6121
6122 return multiplier;
6123}

References AddPct(), and GetAuraEffectsByType().

Referenced by Player::UpdateEnergyRegen(), and Player::UpdateManaRegen().

◆ GetTotalStatValue()

float Unit::GetTotalStatValue ( Stats  stat,
float  additionalValue = 0.0f 
) const
15393{
15394 UnitMods unitMod = UnitMods(static_cast<uint16>(UNIT_MOD_STAT_START) + stat);
15395
15396 if (m_auraModifiersGroup[unitMod][TOTAL_PCT] <= 0.0f)
15397 return 0.0f;
15398
15399 // value = ((base_value * base_pct) + total_value) * total_pct
15400 float value = m_auraModifiersGroup[unitMod][BASE_VALUE] + GetCreateStat(stat);
15401 value *= m_auraModifiersGroup[unitMod][BASE_PCT];
15402 value += m_auraModifiersGroup[unitMod][TOTAL_VALUE] + additionalValue;
15403 value *= m_auraModifiersGroup[unitMod][TOTAL_PCT];
15404
15405 return value;
15406}
UnitMods
Definition Unit.h:143
@ UNIT_MOD_STAT_START
Definition Unit.h:171
float GetCreateStat(Stats stat) const
Definition Unit.h:1002

References BASE_PCT, BASE_VALUE, GetCreateStat(), m_auraModifiersGroup, TOTAL_PCT, TOTAL_VALUE, and UNIT_MOD_STAT_START.

Referenced by Player::UpdateAllStats(), Guardian::UpdateStats(), and Player::UpdateStats().

◆ getTransForm()

◆ GetTransGUID()

◆ GetUnitBlockChance()

float Unit::GetUnitBlockChance ( ) const
3731{
3732 if (Player const* player = ToPlayer())
3733 {
3734 if (player->CanBlock())
3735 {
3736 Item* tmpitem = player->GetUseableItemByPos(INVENTORY_SLOT_BAG_0, EQUIPMENT_SLOT_OFFHAND);
3737 if (tmpitem && !tmpitem->IsBroken() && tmpitem->GetTemplate()->Block)
3739 }
3740 // is player but has no block ability or no not broken shield equipped
3741 return 0.0f;
3742 }
3743 else
3744 {
3745 if (ToCreature()->IsTotem())
3746 return 0.0f;
3747 else
3748 {
3749 float block = 5.0f;
3751 return block > 0.0f ? block : 0.0f;
3752 }
3753 }
3754}
@ EQUIPMENT_SLOT_OFFHAND
Definition Player.h:698
#define INVENTORY_SLOT_BAG_0
Definition Player.h:677
@ SPELL_AURA_MOD_BLOCK_PERCENT
Definition SpellAuraDefines.h:114
@ PLAYER_BLOCK_PERCENTAGE
Definition UpdateFields.h:346
bool IsBroken() const
Definition Item.h:257
uint32 Block
Definition ItemTemplate.h:674

References ItemTemplate::Block, EQUIPMENT_SLOT_OFFHAND, Object::GetFloatValue(), Item::GetTemplate(), GetTotalAuraModifier(), INVENTORY_SLOT_BAG_0, Item::IsBroken(), IsTotem(), PLAYER_BLOCK_PERCENTAGE, SPELL_AURA_MOD_BLOCK_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitCriticalChance()

float Unit::GetUnitCriticalChance ( WeaponAttackType  attackType,
Unit const *  victim 
) const
3757{
3758 float crit;
3759
3760 if (IsPlayer())
3761 {
3762 switch (attackType)
3763 {
3764 case BASE_ATTACK:
3766 break;
3767 case OFF_ATTACK:
3769 break;
3770 case RANGED_ATTACK:
3772 break;
3773 // Just for good manner
3774 default:
3775 crit = 0.0f;
3776 break;
3777 }
3778 }
3779 else
3780 {
3781 crit = 5.0f;
3784 }
3785
3786 // flat aura mods
3787 if (attackType == RANGED_ATTACK)
3788 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE);
3789 else
3790 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE);
3791
3792 AuraEffectList const& mTotalAuraList = victim->GetAuraEffectsByType(SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER);
3793 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
3794 {
3795 if (GetGUID() != (*i)->GetCasterGUID())
3796 continue;
3797
3798 crit += (*i)->GetAmount();
3799 }
3800
3801 // reduce crit chance from Rating for players
3802 if (attackType != RANGED_ATTACK)
3803 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_MELEE);
3804 else
3805 Unit::ApplyResilience(victim, &crit, nullptr, false, CR_CRIT_TAKEN_RANGED);
3806
3807 // Apply crit chance from defence skill
3808 crit += (int32(GetMaxSkillValueForLevel(victim)) - int32(victim->GetDefenseSkillValue(this))) * 0.04f;
3809
3810 // xinef: SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE should be calculated at the end
3811 crit += victim->GetTotalAuraModifier(SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE);
3812
3813 if (crit < 0.0f)
3814 crit = 0.0f;
3815 return crit;
3816}
@ SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER
Definition SpellAuraDefines.h:371
@ SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE
Definition SpellAuraDefines.h:251
@ SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
Definition SpellAuraDefines.h:260
@ SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE
Definition SpellAuraDefines.h:250
@ SPELL_AURA_MOD_CRIT_PCT
Definition SpellAuraDefines.h:353
@ SPELL_AURA_MOD_WEAPON_CRIT_PERCENT
Definition SpellAuraDefines.h:115
@ PLAYER_RANGED_CRIT_PERCENTAGE
Definition UpdateFields.h:352
@ PLAYER_CRIT_PERCENTAGE
Definition UpdateFields.h:351
@ PLAYER_OFFHAND_CRIT_PERCENTAGE
Definition UpdateFields.h:353
uint16 GetMaxSkillValueForLevel(Unit const *target=nullptr) const
Definition Unit.h:1132

References ApplyResilience(), BASE_ATTACK, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, GetAuraEffectsByType(), GetDefenseSkillValue(), Object::GetFloatValue(), Object::GetGUID(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), Object::IsPlayer(), OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_MOD_CRIT_PCT, and SPELL_AURA_MOD_WEAPON_CRIT_PERCENT.

Referenced by spell_dk_wandering_plague_aura::CheckProc(), and RollMeleeOutcomeAgainst().

◆ GetUnitDodgeChance()

float Unit::GetUnitDodgeChance ( ) const
3669{
3670 if (IsPlayer())
3671 return ToPlayer()->GetRealDodge(); //GetFloatValue(PLAYER_DODGE_PERCENTAGE);
3672 else
3673 {
3674 if (ToCreature()->IsTotem())
3675 return 0.0f;
3676 else
3677 {
3678 float dodge = ToCreature()->isWorldBoss() ? 5.85f : 5.0f; // Xinef: bosses should have 6.5% dodge (5.9 + 0.6 from defense skill difference)
3680 return dodge > 0.0f ? dodge : 0.0f;
3681 }
3682 }
3683}
@ SPELL_AURA_MOD_DODGE_PERCENT
Definition SpellAuraDefines.h:112
float GetRealDodge() const
Definition Player.h:2622

References Player::GetRealDodge(), GetTotalAuraModifier(), Object::IsPlayer(), IsTotem(), Creature::isWorldBoss(), SPELL_AURA_MOD_DODGE_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitFlags()

◆ GetUnitFlags2()

UnitFlags2 Unit::GetUnitFlags2 ( ) const
inline

Remove all UnitFlags and set new ones. UnitFlags available in UnitDefines.h.

UnitFlags2
Definition UnitDefines.h:287
@ UNIT_FIELD_FLAGS_2
Definition UpdateFields.h:118

References Object::GetUInt32Value(), and UNIT_FIELD_FLAGS_2.

Referenced by npc_commandscript::HandleNpcInfoCommand().

◆ GetUnitMeleeSkill()

uint32 Unit::GetUnitMeleeSkill ( Unit const *  target = nullptr) const
inline
1114{ return (target ? getLevelForTarget(target) : GetLevel()) * 5; }

References GetLevel(), and getLevelForTarget().

Referenced by DealMeleeDamage(), GetDefenseSkillValue(), and GetWeaponSkillValue().

◆ GetUnitMissChance()

float Unit::GetUnitMissChance ( WeaponAttackType  attType) const
3716{
3717 float miss_chance = 5.00f;
3718
3719 if (Player const* player = ToPlayer())
3720 miss_chance += player->GetMissPercentageFromDefence();
3721
3722 if (attType == RANGED_ATTACK)
3724 else
3726
3727 return miss_chance;
3728}
@ SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE
Definition SpellAuraDefines.h:247
@ SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE
Definition SpellAuraDefines.h:248

References GetTotalAuraModifier(), RANGED_ATTACK, SPELL_AURA_MOD_ATTACKER_MELEE_HIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_HIT_CHANCE, and Object::ToPlayer().

Referenced by MeleeSpellMissChance().

◆ GetUnitMovementFlags()

◆ GetUnitParryChance()

float Unit::GetUnitParryChance ( ) const
3686{
3687 float chance = 0.0f;
3688
3689 if (Player const* player = ToPlayer())
3690 {
3691 if (player->CanParry())
3692 {
3693 Item* tmpitem = player->GetWeaponForAttack(BASE_ATTACK, true);
3694 if (!tmpitem)
3695 tmpitem = player->GetWeaponForAttack(OFF_ATTACK, true);
3696
3697 if (tmpitem)
3698 chance = player->GetRealParry(); //GetFloatValue(PLAYER_PARRY_PERCENTAGE);
3699 }
3700 }
3701 else if (IsCreature())
3702 {
3703 if (ToCreature()->isWorldBoss())
3704 chance = 13.4f; // + 0.6 by skill diff
3706 chance = 5.0f;
3707
3708 // Xinef: if aura is present, type should not matter
3710 }
3711
3712 return chance > 0.0f ? chance : 0.0f;
3713}
@ SPELL_AURA_MOD_PARRY_PERCENT
Definition SpellAuraDefines.h:110

References BASE_ATTACK, CREATURE_TYPE_HUMANOID, GetCreatureType(), GetTotalAuraModifier(), Object::IsCreature(), OFF_ATTACK, SPELL_AURA_MOD_PARRY_PERCENT, Object::ToCreature(), and Object::ToPlayer().

Referenced by spell_dk_spell_deflection::Absorb(), MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ GetUnitState()

uint32 Unit::GetUnitState ( ) const
inline

◆ GetUnitTypeMask()

uint32 Unit::GetUnitTypeMask ( ) const
inline
698{ return m_unitTypeMask; }

References m_unitTypeMask.

◆ GetVehicle()

Vehicle * Unit::GetVehicle ( ) const
inline
1839{ return m_vehicle; }

References m_vehicle.

Referenced by KillRewarder::_InitXP(), Vehicle::AddPassenger(), WorldSession::BuildPartyMemberStatsChangedPacket(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::CanAIAttack(), npc_raging_spirit::npc_raging_spiritAI::CanAIAttack(), npc_icc_lk_checktarget::npc_icc_lk_checktargetAI::CanAIAttack(), boss_flame_leviathan_defense_turret::boss_flame_leviathan_defense_turretAI::CanAIAttack(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::CheckAchievementCriteriaMeet(), Spell::CheckCast(), Spell::EffectJumpDest(), Spell::EffectKnockBack(), CreatureAI::EnterEvadeMode(), GetDirectTransport(), SmartScript::GetTargets(), GetTransGUID(), WorldSession::HandleAttackSwingOpcode(), WorldSession::HandleChangeSeatsOnControlledVehicle(), spell_switch_infragreen_bomber_station::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), Player::IsPetNeedBeTemporaryUnsummoned(), npc_nexus_lord::npc_nexus_lordAI::JustDied(), npc_scion_of_eternity::npc_scion_of_eternityAI::JustDied(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::MoveInLineOfSight(), achievement_flame_leviathan_garage::OnCheck(), achievement_wg_didnt_stand_a_chance::OnCheck(), npc_announcer_toc5::OnGossipHello(), BattlefieldWG::OnPlayerLeaveWar(), boss_flame_leviathan_overload_device::boss_flame_leviathan_overload_deviceAI::OnSpellClick(), VehicleCheck::operator()(), OutDebugInfo(), Player::ProcessDelayedOperations(), Player::ProcessTerrainStatusUpdate(), Vehicle::RemovePassenger(), Creature::SelectVictim(), SetControlled(), Player::SetViewpoint(), lfg::LFGMgr::TeleportPlayer(), npc_pilgrims_bounty_chair::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_impaling_spear::npc_impaling_spearAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdatePosition(), UpdateSpeed(), GameObject::Use(), Acore::MessageDistDeliverer::Visit(), and Acore::MessageDistDelivererToHostile::Visit().

◆ GetVehicleBase()

◆ GetVehicleCreatureBase()

◆ GetVehicleKit()

Vehicle * Unit::GetVehicleKit ( ) const
inline
1838{ return m_vehicleKit; }

References m_vehicleKit.

Referenced by _EnterVehicle(), Creature::AddToWorld(), Creature::AIM_Initialize(), boss_xt002::boss_xt002AI::AttachHeart(), npc_salvaged_siege_engine::BeforeSpellClick(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::boss_deathbringer_saurfangAI(), Object::BuildMovementUpdate(), spell_igb_cannon_blast::CalculatePower(), Aura::CanStackWith(), spell_demolisher_ride_vehicle::CheckCast(), SmartAI::CheckConditions(), VehicleAI::CheckConditions(), Map::CreatureRelocation(), MotionTransport::DelayedTeleportTransport(), Dismount(), npc_orb_carrier::npc_orb_carrierAI::DoAction(), npc_ulduar_vx001::npc_ulduar_vx001AI::DoAction(), npc_hover_disk::npc_hover_diskAI::DoAction(), boss_skadi_grauf::boss_skadi_graufAI::DoAction(), Spell::EffectTeleportUnits(), CreatureAI::EnterEvadeMode(), boss_ick::boss_ickAI::GetKrick(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::GetS3(), SmartScript::GetTargets(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraSetVehicle(), WorldSession::HandleCastSpellOpcode(), spell_q13280_13283_plant_battle_standard::HandleDummy(), WorldSession::HandleEjectPassenger(), spell_q12919_gymers_throw::HandleScript(), HandleSpellClick(), IsOnVehicle(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), boss_gormok::boss_gormokAI::JustEngagedWith(), Mount(), npc_hover_disk::npc_hover_diskAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::MovementInform(), npc_vics_flying_machine::npc_vics_flying_machineAI::MovementInform(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::npc_high_overlord_saurfangAI(), npc_orb_carrier::npc_orb_carrierAI::npc_orb_carrierAI(), spell_systems_shutdown_aura::OnApply(), VehicleAI::OnCharmed(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), FlameLeviathanPursuedTargetSelector::operator()(), OutDebugInfo(), npc_wintergarde_gryphon::PassengerBoarded(), boss_flame_leviathan_seat::boss_flame_leviathan_seatAI::PassengerBoarded(), Map::PlayerRelocation(), SmartScript::ProcessAction(), boss_skadi_grauf::boss_skadi_graufAI::RemoveSkadi(), Spell::SelectImplicitCasterObjectTargets(), SmartAI::SmartAI(), npc_wintergarde_gryphon::SpellHit(), npc_vics_flying_machine::npc_vics_flying_machineAI::SpellHit(), npc_brunnhildar_prisoner::npc_brunnhildar_prisonerAI::SpellHit(), boss_flame_leviathan::boss_flame_leviathanAI::SpellHitTarget(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::SpreadFire(), boss_gormok::boss_gormokAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), npc_preparations_for_war_vehicle::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_freed_protodrake::npc_freed_protodrakeAI::UpdateAI(), npc_wg_siege_machine::npc_wg_siege_machineAI::UpdateAI(), UpdateHeight(), and UpdateOrientation().

◆ GetVictim()

Unit * Unit::GetVictim ( ) const
inline
848{ return m_attacking; }

References m_attacking.

Referenced by boss_marli::_chargePlayer(), PetAI::_needToStop(), npc_escortAI::AssistPlayerInCombatAgainst(), FollowerAI::AssistPlayerInCombatAgainst(), SmartAI::AssistPlayerInCombatAgainst(), Attack(), PetAI::AttackedBy(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), boss_malygos::boss_malygosAI::AttackStart(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), Object::BuildMovementUpdate(), Creature::CallAssistance(), Creature::CallForHelp(), TurretAI::CanAIAttack(), PetAI::CanAttack(), boss_attumen::CanMeleeHit(), boss_midnight::CanMeleeHit(), boss_swamplord_muselek::CanShootVictim(), Spell::CheckCast(), boss_mandokir::boss_mandokirAI::DamageDealt(), boss_isalien::DamageTaken(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_dark_nucleus::npc_dark_nucleusAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_leotheras_the_blind::DemonTime(), boss_sacrolash::DoAction(), boss_alythess::DoAction(), boss_skadi::boss_skadiAI::DoAction(), UnitAI::DoCast(), UnitAI::DoCastVictim(), ConfusedMovementGenerator< T >::DoFinalize(), Creature::DoFleeToGetAssistance(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), ScriptedAI::DoStopAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectTaunt(), boss_ouro::Emerge(), AssistDelayEvent::Execute(), RestoreAttack::Execute(), StartMovementEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::ExecuteEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::ExecuteEvent(), emerald_dragonAI::ExecuteEvent(), spell_shazzrah_gate_dummy::FilterTargets(), spell_malchezaar_enfeeble::FilterTargets(), spell_chain_burn::FilterTargets(), spell_morogrim_tidewalker_watery_grave::FilterTargets(), TimedFleeingMovementGenerator::Finalize(), getAttackerForHelper(), ThreatMgr::GetCurrentVictim(), Player::GetInitialVisiblePackets(), CreatureGroup::GetNewTargetForMember(), SmartScript::GetTargets(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), cast_commandscript::HandleCastTargetCommad(), spell_aggro_drones::HandleDummy(), spell_gen_threshalisk_charge::HandleDummy(), HandleDummyAuraProc(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_lurker_below_spout::HandleEffectRemove(), AuraEffect::HandleModPossessPet(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldSession::HandlePetActionHelper(), WorldSession::HandleSetRaidDifficultyOpcode(), ChaseMovementGenerator< T >::HasLostTarget(), Spell::InitExplicitTargets(), RotateMovementGenerator::Initialize(), IsMutualChase(), boss_ouro::IsPlayerWithinMeleeRange(), boss_attumen::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), npc_malchezaar_axe::JustEngagedWith(), boss_shade_of_aran::JustEngagedWith(), boss_akilzon::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_zealot_zath::JustEngagedWith(), npc_yor::JustEngagedWith(), npc_flame_of_azzinoth::JustEngagedWith(), boss_essence_of_anger::boss_essence_of_angerAI::JustEngagedWith(), boss_swamplord_muselek::JustEngagedWith(), boss_nethermancer_sepethrea::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), boss_sacrolash::JustEngagedWith(), boss_alythess::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), boss_vem::JustEngagedWith(), boss_veklor::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_midnight::JustSummoned(), boss_nightbane::JustSummoned(), boss_halazzi::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), boss_fathomlord_karathress::JustSummoned(), boss_fathomguard_tidalvess::JustSummoned(), boss_the_black_stalker::JustSummoned(), boss_nethermancer_sepethrea::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), npc_emily::npc_emilyAI::JustSummoned(), PetAI::KilledUnit(), boss_ick::boss_ickAI::KilledUnit(), boss_flame_leviathan::boss_flame_leviathanAI::KilledUnit(), spell_svalna_revive_champion::Land(), CreatureGroup::LeaderMoveTo(), CreatureGroup::MemberEngagingTarget(), SmartAI::MoveAway(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), npc_kerlonian::npc_kerlonianAI::MoveInLineOfSight(), npc_tooga::npc_toogaAI::MoveInLineOfSight(), npc_ringo::npc_ringoAI::MoveInLineOfSight(), boss_gluth::boss_gluthAI::MoveInLineOfSight(), npc_future_you::npc_future_youAI::MoveInLineOfSight(), npc_captain_saeed::npc_captain_saeedAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), boss_nightbane::MovementInform(), boss_bug_trio::MovementInform(), boss_lady_vashj::MovementInform(), boss_nazan::MovementInform(), boss_felmyst::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_kagani_nightstrike::MovementInform(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), npc_pet_mage_mirror_image::MySelectNextTarget(), NecroticPlagueTargetCheck::operator()(), NonTankTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), BoneStormMoveTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), UnboundPlagueTargetSelector::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), boss_nefarian::PathEndReached(), SmartScript::ProcessEvent(), SmartScript::ProcessEventsFor(), SmartScript::ProcessTimedAction(), boss_grobbulus::boss_grobbulusAI::PullChamberAdds(), Creature::ReleaseFocus(), boss_leotheras_the_blind::Reset(), boss_magtheridon::Reset(), npc_pet_hunter_snake_trap::Reset(), Creature::ResumeChasingVictim(), boss_high_botanist_freywinn::ResumeEncounter(), Resurrect(), boss_kiljaeden::ScheduleBasicAbilities(), npc_sunblade_scout::ScheduleCombat(), npc_amanishi_scout::ScheduleCombat(), boss_taldaram::ScheduleCombatEvents(), boss_magtheridon::ScheduleCombatEvents(), npc_thaladred::ScheduleEvents(), boss_nightbane::ScheduleFly(), boss_the_lurker_below::SchedulerPhaseOne(), npc_giant_claw_tentacle::ScheduleTasks(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), PetAI::SelectNextTarget(), SmartAI::SetCombatMove(), SetConfused(), SetFeared(), SetStunned(), boss_murmur::ShouldCastResonance(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), boss_quartermaster_zigris::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::SpellHitTarget(), npc_escortAI::Start(), FollowerAI::StartFollow(), StopAttackFaction(), SummonCroneIfReady(), boss_akilzon::SummonEagles(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_dorothee::SummonTito(), TauntApply(), TauntFadeOut(), npc_daphne_stilwell::npc_daphne_stilwellAI::Update(), Pet::Update(), Creature::Update(), Player::Update(), CasterAI::UpdateAI(), ArcherAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_escortAI::UpdateAI(), boss_general_angerforge::boss_general_angerforgeAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_broodlord::boss_broodlordAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_skeram::UpdateAI(), npc_muglash::npc_muglashAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), npc_twilight_summon::npc_twilight_summonAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_toc_shaman::npc_toc_shamanAI::UpdateAI(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::UpdateAI(), npc_toc_warlock::npc_toc_warlockAI::UpdateAI(), npc_toc_mage::npc_toc_mageAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), npc_toc_boomkin::npc_toc_boomkinAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::UpdateAI(), npc_toc_pet_hunter::npc_toc_pet_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_spirit_warden::npc_spirit_wardenAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), npc_boss_gothik_minion::npc_boss_gothik_minionAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), npc_auriaya_sanctum_sentry::npc_auriaya_sanctum_sentryAI::UpdateAI(), npc_auriaya_feral_defender::npc_auriaya_feral_defenderAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_watcher::npc_ulduar_dark_rune_watcherAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_pummeller::npc_xt002_pummellerAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), npc_azure_invader::npc_azure_invaderAI::UpdateAI(), npc_azure_raider::npc_azure_raiderAI::UpdateAI(), npc_azure_captain::npc_azure_captainAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_wounded_skirmisher::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_lady_malande::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), guard_shattrath_scryer::guard_shattrath_scryerAI::UpdateAI(), guard_shattrath_aldor::guard_shattrath_aldorAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), PossessedAI::UpdateAI(), PetAI::UpdateAI(), FollowerAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), npc_xt002_life_spark::npc_xt002_life_sparkAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), npc_pet_gen_gnomish_flame_turret::UpdateAI(), Player::UpdateCharmedAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), Player::UpdateFFAPvPFlag(), Player::UpdateFFAPvPState(), SmartAI::UpdatePath(), boss_netherspite::UpdatePortals(), CreatureAI::UpdateVictim(), CreatureAI::UpdateVictimWithGaze(), and boss_hexlord_malacrass::UseAbility().

◆ GetVirtualItemId()

uint32 Unit::GetVirtualItemId ( uint32  slot) const
21025{
21026 if (slot >= MAX_EQUIPMENT_ITEMS)
21027 return 0;
21028
21030}
#define MAX_EQUIPMENT_ITEMS
Definition CreatureData.h:35
@ UNIT_VIRTUAL_ITEM_SLOT_ID
Definition UpdateFields.h:116

References Object::GetUInt32Value(), MAX_EQUIPMENT_ITEMS, and UNIT_VIRTUAL_ITEM_SLOT_ID.

◆ GetVisibleAura()

AuraApplication * Unit::GetVisibleAura ( uint8  slot)
inline
1460 {
1461 VisibleAuraMap::iterator itr = m_visibleAuras.find(slot);
1462 if (itr != m_visibleAuras.end())
1463 return itr->second;
1464 return nullptr;
1465 }

References m_visibleAuras.

Referenced by WorldSession::BuildPartyMemberStatsChangedPacket(), AuraApplication::BuildUpdatePacket(), and WorldSession::HandleRequestPartyMemberStatsOpcode().

◆ GetVisibleAuras()

◆ GetWeaponDamageRange()

float Unit::GetWeaponDamageRange ( WeaponAttackType  attType,
WeaponDamageRange  type,
uint8  damageIndex = 0 
) const
15543{
15544 if (attType == OFF_ATTACK && !HasOffhandWeaponForAttack())
15545 return 0.0f;
15546
15547 return m_weaponDamage[attType][type][damageIndex];
15548}

References HasOffhandWeaponForAttack(), m_weaponDamage, and OFF_ATTACK.

Referenced by Player::_ApplyWeaponDamage(), Creature::CalculateMinMaxDamage(), Player::CalculateMinMaxDamage(), and Guardian::UpdateDamagePhysical().

◆ GetWeaponProcChance()

float Unit::GetWeaponProcChance ( ) const
13524{
13525 // normalized proc chance for weapon attack speed
13526 // (odd formula...)
13528 return (GetAttackTime(BASE_ATTACK) * 1.8f / 1000.0f);
13530 return (GetAttackTime(OFF_ATTACK) * 1.6f / 1000.0f);
13531 return 0;
13532}

References BASE_ATTACK, GetAttackTime(), HasOffhandWeaponForAttack(), isAttackReady(), and OFF_ATTACK.

Referenced by Player::CastItemCombatSpell().

◆ GetWeaponSkillValue()

uint32 Unit::GetWeaponSkillValue ( WeaponAttackType  attType,
Unit const *  target = nullptr 
) const
3819{
3820 uint32 value = 0;
3821 if (Player const* player = ToPlayer())
3822 {
3823 Item* item = player->GetWeaponForAttack(attType, true);
3824
3825 // feral or unarmed skill only for base attack
3826 if (attType != BASE_ATTACK && !item)
3827 return 0;
3828
3829 if (IsInFeralForm())
3830 return GetMaxSkillValueForLevel(); // always maximized SKILL_FERAL_COMBAT in fact
3831
3832 // weapon skill or (unarmed for base attack)
3833 uint32 skill = SKILL_UNARMED;
3834 if (item)
3835 skill = item->GetSkill();
3836
3837 // in PvP use full skill instead current skill value
3838 value = (target && target->IsControlledByPlayer())
3839 ? player->GetMaxSkillValue(skill)
3840 : player->GetSkillValue(skill);
3841 // Modify value from ratings
3842 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL));
3843 switch (attType)
3844 {
3845 case BASE_ATTACK:
3846 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_MAINHAND));
3847 break;
3848 case OFF_ATTACK:
3849 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_OFFHAND));
3850 break;
3851 case RANGED_ATTACK:
3852 value += uint32(player->GetRatingBonusValue(CR_WEAPON_SKILL_RANGED));
3853 break;
3854 default:
3855 break;
3856 }
3857 }
3858 else
3859 value = GetUnitMeleeSkill(target);
3860 return value;
3861}
@ SKILL_UNARMED
Definition SharedDefines.h:3146
@ CR_WEAPON_SKILL_RANGED
Definition Unit.h:240
@ CR_WEAPON_SKILL
Definition Unit.h:218
@ CR_WEAPON_SKILL_OFFHAND
Definition Unit.h:239
@ CR_WEAPON_SKILL_MAINHAND
Definition Unit.h:238
uint32 GetSkill()
Definition Item.cpp:555
bool IsInFeralForm() const
Definition Unit.h:1873

References BASE_ATTACK, CR_WEAPON_SKILL, CR_WEAPON_SKILL_MAINHAND, CR_WEAPON_SKILL_OFFHAND, CR_WEAPON_SKILL_RANGED, GetMaxSkillValueForLevel(), Item::GetSkill(), GetUnitMeleeSkill(), IsControlledByPlayer(), IsInFeralForm(), OFF_ATTACK, RANGED_ATTACK, SKILL_UNARMED, and Object::ToPlayer().

Referenced by isSpellBlocked(), MeleeSpellHitResult(), RollMeleeOutcomeAgainst(), RollMeleeOutcomeAgainst(), and Player::UpdateCritPercentage().

◆ HandleAuraProc()

bool Unit::HandleAuraProc ( Unit victim,
uint32  damage,
Aura triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
bool *  handled 
)
private
8803{
8804 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
8805
8806 switch (dummySpell->SpellFamilyName)
8807 {
8809 switch (dummySpell->Id)
8810 {
8811 // Nevermelting Ice Crystal
8812 case 71564:
8813 RemoveAuraFromStack(71564);
8814 *handled = true;
8815 break;
8816 // Gaseous Bloat
8817 case 70672:
8818 case 72455:
8819 case 72832:
8820 case 72833:
8821 {
8822 if (Unit* caster = triggeredByAura->GetCaster())
8823 if (victim && caster->GetGUID() == victim->GetGUID())
8824 {
8825 *handled = true;
8826 uint32 stack = triggeredByAura->GetStackAmount();
8827 int32 const mod = (GetMap()->GetSpawnMode() & 1) ? 1500 : 1250;
8828 int32 dmg = 0;
8829 for (uint8 i = 1; i <= stack; ++i)
8830 dmg += mod * i;
8831 caster->CastCustomSpell(70701, SPELLVALUE_BASE_POINT0, dmg);
8832 }
8833 break;
8834 }
8835 // Ball of Flames Proc
8836 case 71756:
8837 case 72782:
8838 case 72783:
8839 case 72784:
8840 RemoveAuraFromStack(dummySpell->Id);
8841 *handled = true;
8842 break;
8843 // Discerning Eye of the Beast
8844 case 59915:
8845 {
8846 CastSpell(this, 59914, true); // 59914 already has correct basepoints in DBC, no need for custom bp
8847 *handled = true;
8848 break;
8849 }
8850 // Swift Hand of Justice
8851 case 59906:
8852 {
8853 int32 bp0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_0]. CalcValue());
8854 CastCustomSpell(this, 59913, &bp0, nullptr, nullptr, true);
8855 *handled = true;
8856 break;
8857 }
8858 }
8859
8860 break;
8861 case SPELLFAMILY_MAGE:
8862 {
8863 // Combustion
8864 switch (dummySpell->Id)
8865 {
8866 case 11129:
8867 {
8868 *handled = true;
8869 Unit* caster = triggeredByAura->GetCaster();
8870 if (!caster || !damage)
8871 return false;
8872
8873 // last charge and crit
8874 if (triggeredByAura->GetCharges() <= 1 && (procEx & PROC_EX_CRITICAL_HIT))
8875 return true; // charge counting (will removed)
8876
8877 CastSpell(this, 28682, true);
8878
8879 return procEx & PROC_EX_CRITICAL_HIT;
8880 }
8881 // Empowered Fire
8882 case 31656:
8883 case 31657:
8884 case 31658:
8885 {
8886 *handled = true;
8887
8888 SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(67545);
8889 if (!spInfo)
8890 return false;
8891
8892 int32 bp0 = int32(CalculatePct(GetMaxPower(POWER_MANA), spInfo->Effects[0].CalcValue()));
8893 CastCustomSpell(this, 67545, &bp0, nullptr, nullptr, true, nullptr, triggeredByAura->GetEffect(EFFECT_0), GetGUID());
8894 return true;
8895 }
8896 }
8897 break;
8898 }
8900 {
8901 // Blood of the North
8902 // Reaping
8903 // Death Rune Mastery
8904 // xinef: Icon 22 is used for item bonus, skip
8905 if (dummySpell->SpellIconID == 3041 || (dummySpell->SpellIconID == 22 && dummySpell->Id != 62459) || dummySpell->SpellIconID == 2622)
8906 {
8907 *handled = true;
8908 // Convert recently used Blood Rune to Death Rune
8909 if (Player* player = ToPlayer())
8910 {
8911 if (!player->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY))
8912 return false;
8913
8914 // xinef: not true
8915 //RuneType rune = ToPlayer()->GetLastUsedRune();
8916 // can't proc from death rune use
8917 //if (rune == RUNE_DEATH)
8918 // return false;
8919 AuraEffect* aurEff = triggeredByAura->GetEffect(EFFECT_0);
8920 if (!aurEff)
8921 return false;
8922
8923 // Reset amplitude - set death rune remove timer to 30s
8924 aurEff->ResetPeriodic(true);
8925 uint32 runesLeft;
8926
8927 if (dummySpell->SpellIconID == 2622)
8928 runesLeft = 2;
8929 else
8930 runesLeft = 1;
8931
8932 for (uint8 i = 0; i < MAX_RUNES && runesLeft; ++i)
8933 {
8934 if (dummySpell->SpellIconID == 2622)
8935 {
8936 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8937 player->GetBaseRune(i) == RUNE_BLOOD)
8938 continue;
8939 }
8940 else
8941 {
8942 if (player->GetCurrentRune(i) == RUNE_DEATH ||
8943 player->GetBaseRune(i) != RUNE_BLOOD)
8944 continue;
8945 }
8946 if (player->GetRuneCooldown(i) != player->GetRuneBaseCooldown(i, false))
8947 continue;
8948
8949 --runesLeft;
8950 // Mark aura as used
8951 player->AddRuneByAuraEffect(i, RUNE_DEATH, aurEff);
8952 }
8953 return true;
8954 }
8955 return false;
8956 }
8957 break;
8958 }
8960 {
8961 switch (dummySpell->Id)
8962 {
8963 // Item - Warrior T10 Protection 4P Bonus
8964 case 70844:
8965 {
8966 int32 basepoints0 = CalculatePct(GetMaxHealth(), dummySpell->Effects[EFFECT_1]. CalcValue());
8967 CastCustomSpell(this, 70845, &basepoints0, nullptr, nullptr, true);
8968 break;
8969 }
8970 default:
8971 break;
8972 }
8973 break;
8974 }
8975 case SPELLFAMILY_SHAMAN:
8976 {
8977 // Flurry
8978 if ((dummySpell->SpellFamilyFlags[1] & 0x00000200) != 0)
8979 {
8980 if (cooldown)
8981 {
8982 if (HasSpellCooldown(dummySpell->Id))
8983 {
8984 *handled = true;
8985 break;
8986 }
8987
8988 AddSpellCooldown(dummySpell->Id, 0, cooldown);
8989 }
8990 }
8991 break;
8992 }
8993 }
8994 return false;
8995}
@ RUNE_DEATH
Definition Player.h:418
@ RUNE_BLOOD
Definition Player.h:415
@ EFFECT_1
Definition SharedDefines.h:32
@ SPELLFAMILY_MAGE
Definition SharedDefines.h:3786
@ SPELLFAMILY_GENERIC
Definition SharedDefines.h:3783
@ SPELLFAMILY_WARRIOR
Definition SharedDefines.h:3787
@ SPELLFAMILY_SHAMAN
Definition SharedDefines.h:3794
@ SPELLFAMILY_DEATHKNIGHT
Definition SharedDefines.h:3798
void ResetPeriodic(bool resetPeriodicTimer=false)
Definition SpellAuraEffects.h:89
AuraEffect * GetEffect(uint8 effIndex) const
Definition SpellAuras.h:175
uint8 GetSpawnMode() const
Definition Map.h:262
virtual bool HasSpellCooldown(uint32) const
Definition Unit.h:1262
virtual void AddSpellCooldown(uint32, uint32, uint32, bool needSendToClient=false, bool forceSendToSpectator=false)
Definition Unit.h:1264
void RemoveAuraFromStack(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4981

References AddSpellCooldown(), CalculatePct(), CastCustomSpell(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, EFFECT_0, EFFECT_1, SpellInfo::Effects, Aura::GetCaster(), Aura::GetCharges(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetMap(), GetMaxHealth(), GetMaxPower(), Map::GetSpawnMode(), Aura::GetSpellInfo(), Aura::GetStackAmount(), HasSpellCooldown(), SpellInfo::Id, MAX_RUNES, POWER_MANA, PROC_EX_CRITICAL_HIT, RemoveAuraFromStack(), AuraEffect::ResetPeriodic(), RUNE_BLOOD, RUNE_DEATH, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_GENERIC, SPELLFAMILY_MAGE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromCharge()

bool Unit::HandleAuraRaidProcFromCharge ( AuraEffect triggeredByAura)
private
17738{
17739 // aura can be deleted at casts
17740 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17741
17742 uint32 damageSpellId;
17743 switch (spellProto->Id)
17744 {
17745 case 57949: // shiver
17746 damageSpellId = 57952;
17747 //animationSpellId = 57951; dummy effects for jump spell have unknown use (see also 41637)
17748 break;
17749 case 59978: // shiver
17750 damageSpellId = 59979;
17751 break;
17752 case 43593: // Cold Stare
17753 damageSpellId = 43594;
17754 break;
17755 default:
17756 LOG_ERROR("entities.unit", "Unit::HandleAuraRaidProcFromCharge, received unhandled spell: {}", spellProto->Id);
17757 return false;
17758 }
17759
17760 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17761
17762 // jumps
17763 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17764
17765 // current aura expire
17766 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17767
17768 // next target selection
17769 if (jumps > 0)
17770 {
17771 if (Unit* caster = triggeredByAura->GetCaster())
17772 {
17773 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17774 if (Unit* target = GetNextRandomRaidMemberOrPet(radius))
17775 {
17776 CastSpell(target, spellProto, true, nullptr, triggeredByAura, caster_guid);
17777 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17778 aura->SetCharges(jumps);
17779 }
17780 }
17781 }
17782
17783 CastSpell(this, damageSpellId, true, nullptr, triggeredByAura, caster_guid);
17784
17785 return true;
17786}
void SetCharges(uint8 charges)
Definition SpellAuras.cpp:952
Unit * GetNextRandomRaidMemberOrPet(float radius)
Definition Unit.cpp:11200

References CastSpell(), SpellInfo::Effects, AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), GetNextRandomRaidMemberOrPet(), AuraEffect::GetSpellInfo(), SpellInfo::Id, LOG_ERROR, and Aura::SetCharges().

Referenced by ProcDamageAndSpellFor().

◆ HandleAuraRaidProcFromChargeWithValue()

bool Unit::HandleAuraRaidProcFromChargeWithValue ( AuraEffect triggeredByAura)
private
17649{
17650 // aura can be deleted at casts
17651 SpellInfo const* spellProto = triggeredByAura->GetSpellInfo();
17652 int32 heal = triggeredByAura->GetAmount();
17653 ObjectGuid caster_guid = triggeredByAura->GetCasterGUID();
17654
17655 // Currently only Prayer of Mending
17656 if (!(spellProto->SpellFamilyName == SPELLFAMILY_PRIEST && spellProto->SpellFamilyFlags[1] & 0x20))
17657 {
17658 LOG_DEBUG("spells.aura", "Unit::HandleAuraRaidProcFromChargeWithValue, received not handled spell: {}", spellProto->Id);
17659 return false;
17660 }
17661
17662 // jumps
17663 int32 jumps = triggeredByAura->GetBase()->GetCharges() - 1;
17664
17665 // current aura expire
17666 triggeredByAura->GetBase()->SetCharges(1); // will removed at next charges decrease
17667
17668 // next target selection
17669 if (jumps > 0)
17670 {
17671 if (Unit* caster = triggeredByAura->GetCaster())
17672 {
17673 // smart healing
17674 float radius = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcRadius(caster);
17675 std::list<Unit*> nearMembers;
17676
17677 Player* player = nullptr;
17678 if (IsPlayer())
17679 player = ToPlayer();
17680 else if (GetOwner())
17681 player = GetOwner()->ToPlayer();
17682
17683 if (player)
17684 {
17685 Group* group = player->GetGroup();
17686 if (!group)
17687 {
17688 if (player != this)
17689 {
17690 if (IsWithinDistInMap(player, radius))
17691 nearMembers.push_back(player);
17692 }
17693 else if (Unit* pet = GetGuardianPet())
17694 {
17695 if (IsWithinDistInMap(pet, radius))
17696 nearMembers.push_back(pet);
17697 }
17698 }
17699 else
17700 {
17701 for (GroupReference* itr = group->GetFirstMember(); itr != nullptr; itr = itr->next())
17702 if (Player* Target = itr->GetSource())
17703 {
17704 if (Target != this && !IsWithinDistInMap(Target, radius))
17705 continue;
17706
17707 // IsHostileTo check duel and controlled by enemy
17708 if (Target != this && Target->IsAlive() && !IsHostileTo(Target))
17709 nearMembers.push_back(Target);
17710
17711 // Push player's pet to vector
17712 if (Unit* pet = Target->GetGuardianPet())
17713 if (pet != this && pet->IsAlive() && IsWithinDistInMap(pet, radius) && !IsHostileTo(pet))
17714 nearMembers.push_back(pet);
17715 }
17716 }
17717
17718 if (!nearMembers.empty())
17719 {
17720 nearMembers.sort(Acore::HealthPctOrderPred());
17721 if (Unit* target = nearMembers.front())
17722 {
17723 CastSpell(target, 41637 /*Dummy visual effect triggered by main spell cast*/, true);
17724 CastCustomSpell(target, spellProto->Id, &heal, nullptr, nullptr, true, nullptr, triggeredByAura, caster_guid);
17725 if (Aura* aura = target->GetAura(spellProto->Id, caster->GetGUID()))
17726 aura->SetCharges(jumps);
17727 }
17728 }
17729 }
17730 }
17731 }
17732
17733 // heal
17734 CastCustomSpell(this, 33110, &heal, nullptr, nullptr, true, nullptr, nullptr, caster_guid);
17735 return true;
17736}
@ SPELLFAMILY_PRIEST
Definition SharedDefines.h:3789
Definition Unit.h:2210

References CastCustomSpell(), CastSpell(), SpellInfo::Effects, AuraEffect::GetAmount(), AuraEffect::GetBase(), AuraEffect::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCharges(), AuraEffect::GetEffIndex(), Group::GetFirstMember(), Player::GetGroup(), GetGuardianPet(), GetOwner(), AuraEffect::GetSpellInfo(), SpellInfo::Id, IsHostileTo(), Object::IsPlayer(), WorldObject::IsWithinDistInMap(), LOG_DEBUG, Aura::SetCharges(), SPELLFAMILY_PRIEST, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleDummyAuraProc()

bool Unit::HandleDummyAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
ProcEventInfo const &  eventInfo 
)
private
Todo:
: It should be moved to database, shouldn't it?
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
Todo:
: need more info (cooldowns/PPM)
6677{
6678 SpellInfo const* dummySpell = triggeredByAura->GetSpellInfo();
6679 uint32 effIndex = triggeredByAura->GetEffIndex();
6680 int32 triggerAmount = triggeredByAura->GetAmount();
6681 Spell const* spellProc = eventInfo.GetProcSpell();
6682
6683 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
6684 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
6685
6686 uint32 triggered_spell_id = 0;
6687 uint32 cooldown_spell_id = 0; // for random trigger, will be one of the triggered spell to avoid repeatable triggers
6688 // otherwise, it's the triggered_spell_id by default
6689 Unit* target = victim;
6690 int32 basepoints0 = 0;
6691 ObjectGuid originalCaster;
6692
6693 switch (dummySpell->SpellFamilyName)
6694 {
6696 {
6697 switch (dummySpell->Id)
6698 {
6699 // Overkill
6700 case 58426:
6701 {
6702 triggered_spell_id = 58427;
6703 break;
6704 }
6705 // Unstable Power
6706 case 24658:
6707 {
6708 if (!procSpell || procSpell->Id == 24659)
6709 return false;
6710 // Need remove one 24659 aura
6711 RemoveAuraFromStack(24659);
6712 return true;
6713 }
6714 // Restless Strength
6715 case 24661:
6716 {
6717 // Need remove one 24662 aura
6718 RemoveAuraFromStack(24662);
6719 return true;
6720 }
6721 // Mark of Malice
6722 case 33493:
6723 {
6724 if (triggeredByAura->GetBase()->GetCharges() > 1)
6725 return true;
6726
6727 target = this;
6728 triggered_spell_id = 33494;
6729 break;
6730 }
6731 // Twisted Reflection (boss spell)
6732 case 21063:
6733 triggered_spell_id = 21064;
6734 break;
6735 // Vampiric Aura (boss spell)
6736 case 38196:
6737 {
6738 basepoints0 = 3 * damage; // 300%
6739 if (basepoints0 < 0)
6740 return false;
6741
6742 triggered_spell_id = 31285;
6743 target = this;
6744 break;
6745 }
6746 // Aura of Madness (Darkmoon Card: Madness trinket)
6747 //=====================================================
6748 // 39511 Sociopath: +35 strength (Paladin, Rogue, Druid, Warrior)
6749 // 40997 Delusional: +70 attack power (Rogue, Hunter, Paladin, Warrior, Druid)
6750 // 40998 Kleptomania: +35 agility (Warrior, Rogue, Paladin, Hunter, Druid)
6751 // 40999 Megalomania: +41 damage/healing (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6752 // 41002 Paranoia: +35 spell/melee/ranged crit strike rating (All classes)
6753 // 41005 Manic: +35 haste (spell, melee and ranged) (All classes)
6754 // 41009 Narcissism: +35 intellect (Druid, Shaman, Priest, Warlock, Mage, Paladin, Hunter)
6755 // 41011 Martyr Complex: +35 stamina (All classes)
6756 // 41406 Dementia: Every 5 seconds either gives you +5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6757 // 41409 Dementia: Every 5 seconds either gives you -5% damage/healing. (Druid, Shaman, Priest, Warlock, Mage, Paladin)
6758 case 39446:
6759 {
6760 if (!IsPlayer() || !IsAlive())
6761 return false;
6762
6763 // Select class defined buff
6764 switch (getClass())
6765 {
6766 case CLASS_PALADIN: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6767 case CLASS_DRUID: // 39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409
6768 triggered_spell_id = RAND(39511, 40997, 40998, 40999, 41002, 41005, 41009, 41011, 41409);
6769 cooldown_spell_id = 39511;
6770 break;
6771 case CLASS_ROGUE: // 39511, 40997, 40998, 41002, 41005, 41011
6772 case CLASS_WARRIOR: // 39511, 40997, 40998, 41002, 41005, 41011
6773 case CLASS_DEATH_KNIGHT:
6774 triggered_spell_id = RAND(39511, 40997, 40998, 41002, 41005, 41011);
6775 cooldown_spell_id = 39511;
6776 break;
6777 case CLASS_PRIEST: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6778 case CLASS_SHAMAN: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6779 case CLASS_MAGE: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6780 case CLASS_WARLOCK: // 40999, 41002, 41005, 41009, 41011, 41406, 41409
6781 triggered_spell_id = RAND(40999, 41002, 41005, 41009, 41011, 41406, 41409);
6782 cooldown_spell_id = 40999;
6783 break;
6784 case CLASS_HUNTER: // 40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409
6785 triggered_spell_id = RAND(40997, 40999, 41002, 41005, 41009, 41011, 41406, 41409);
6786 cooldown_spell_id = 40997;
6787 break;
6788 default:
6789 return false;
6790 }
6791
6792 target = this;
6793 if (roll_chance_i(10))
6794 ToPlayer()->Say("This is Madness!", LANG_UNIVERSAL);
6795 break;
6796 }
6797 // Sunwell Exalted Caster Neck (??? neck)
6798 // cast ??? Light's Wrath if Exalted by Aldor
6799 // cast ??? Arcane Bolt if Exalted by Scryers
6800 case 46569:
6801 return false; // old unused version
6802 // Sunwell Exalted Caster Neck (Shattered Sun Pendant of Acumen neck)
6803 // cast 45479 Light's Wrath if Exalted by Aldor
6804 // cast 45429 Arcane Bolt if Exalted by Scryers
6805 case 45481:
6806 {
6807 Player* player = ToPlayer();
6808 if (!player)
6809 return false;
6810
6811 // Get Aldor reputation rank
6812 if (player->GetReputationRank(932) == REP_EXALTED)
6813 {
6814 target = this;
6815 triggered_spell_id = 45479;
6816 break;
6817 }
6818 // Get Scryers reputation rank
6819 if (player->GetReputationRank(934) == REP_EXALTED)
6820 {
6821 // triggered at positive/self casts also, current attack target used then
6822 if (target && IsFriendlyTo(target))
6823 {
6824 target = GetVictim();
6825 if (!target)
6826 {
6827 target = player->GetSelectedUnit();
6828 if (!target)
6829 return false;
6830 }
6831 if (IsFriendlyTo(target))
6832 return false;
6833 }
6834
6835 triggered_spell_id = 45429;
6836 break;
6837 }
6838 return false;
6839 }
6840 // Sunwell Exalted Melee Neck (Shattered Sun Pendant of Might neck)
6841 // cast 45480 Light's Strength if Exalted by Aldor
6842 // cast 45428 Arcane Strike if Exalted by Scryers
6843 case 45482:
6844 {
6845 if (!IsPlayer())
6846 return false;
6847
6848 // Get Aldor reputation rank
6849 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6850 {
6851 target = this;
6852 triggered_spell_id = 45480;
6853 break;
6854 }
6855 // Get Scryers reputation rank
6856 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6857 {
6858 triggered_spell_id = 45428;
6859 break;
6860 }
6861 return false;
6862 }
6863 // Sunwell Exalted Tank Neck (Shattered Sun Pendant of Resolve neck)
6864 // cast 45431 Arcane Insight if Exalted by Aldor
6865 // cast 45432 Light's Ward if Exalted by Scryers
6866 case 45483:
6867 {
6868 if (!IsPlayer())
6869 return false;
6870
6871 // Get Aldor reputation rank
6872 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6873 {
6874 target = this;
6875 triggered_spell_id = 45432;
6876 break;
6877 }
6878 // Get Scryers reputation rank
6879 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6880 {
6881 target = this;
6882 triggered_spell_id = 45431;
6883 break;
6884 }
6885 return false;
6886 }
6887 // Sunwell Exalted Healer Neck (Shattered Sun Pendant of Restoration neck)
6888 // cast 45478 Light's Salvation if Exalted by Aldor
6889 // cast 45430 Arcane Surge if Exalted by Scryers
6890 case 45484:
6891 {
6892 if (!IsPlayer())
6893 return false;
6894
6895 // Get Aldor reputation rank
6896 if (ToPlayer()->GetReputationRank(932) == REP_EXALTED)
6897 {
6898 target = this;
6899 triggered_spell_id = 45478;
6900 break;
6901 }
6902 // Get Scryers reputation rank
6903 if (ToPlayer()->GetReputationRank(934) == REP_EXALTED)
6904 {
6905 triggered_spell_id = 45430;
6906 break;
6907 }
6908 return false;
6909 }
6910 // Kill command
6911 case 58914:
6912 {
6913 // Remove aura stack from pet
6914 RemoveAuraFromStack(58914);
6915 Unit* owner = GetOwner();
6916 if (!owner)
6917 return true;
6918 // reduce the owner's aura stack
6919 owner->RemoveAuraFromStack(34027);
6920 return true;
6921 }
6922 // Vampiric Touch (generic, used by some boss)
6923 case 52723:
6924 case 60501:
6925 {
6926 triggered_spell_id = 52724;
6927 basepoints0 = damage / 2;
6928 target = this;
6929 break;
6930 }
6931 // Divine purpose
6932 case 31871:
6933 case 31872:
6934 {
6935 // Roll chane
6936 if (!victim || !victim->IsAlive() || !roll_chance_i(triggerAmount))
6937 return false;
6938
6939 // Remove any stun effect on target
6941 return true;
6942 }
6943 // Glyph of Life Tap
6944 case 63320:
6945 {
6946 triggered_spell_id = 63321; // Life Tap
6947 break;
6948 }
6949 case 71519: // Deathbringer's Will Normal
6950 {
6951 if (!IsPlayer() || HasSpellCooldown(71484))
6952 return false;
6953
6954 AddSpellCooldown(71484, 0, cooldown);
6955
6956 std::vector<uint32> RandomSpells;
6957 switch (getClass())
6958 {
6959 case CLASS_WARRIOR:
6960 case CLASS_PALADIN:
6961 case CLASS_DEATH_KNIGHT:
6962 RandomSpells.push_back(71484);
6963 RandomSpells.push_back(71491);
6964 RandomSpells.push_back(71492);
6965 break;
6966 case CLASS_SHAMAN:
6967 case CLASS_ROGUE:
6968 RandomSpells.push_back(71486);
6969 RandomSpells.push_back(71485);
6970 RandomSpells.push_back(71492);
6971 break;
6972 case CLASS_DRUID:
6973 RandomSpells.push_back(71484);
6974 RandomSpells.push_back(71485);
6975 RandomSpells.push_back(71492);
6976 break;
6977 case CLASS_HUNTER:
6978 RandomSpells.push_back(71486);
6979 RandomSpells.push_back(71491);
6980 RandomSpells.push_back(71485);
6981 break;
6982 default:
6983 return false;
6984 }
6985 if (RandomSpells.empty()) // shouldn't happen
6986 return false;
6987
6988 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
6989 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
6990 break;
6991 }
6992 case 71562: // Deathbringer's Will Heroic
6993 {
6994 if (!IsPlayer() || HasSpellCooldown(71561))
6995 return false;
6996
6997 AddSpellCooldown(71561, 0, cooldown);
6998
6999 std::vector<uint32> RandomSpells;
7000 switch (getClass())
7001 {
7002 case CLASS_WARRIOR:
7003 case CLASS_PALADIN:
7004 case CLASS_DEATH_KNIGHT:
7005 RandomSpells.push_back(71561);
7006 RandomSpells.push_back(71559);
7007 RandomSpells.push_back(71560);
7008 break;
7009 case CLASS_SHAMAN:
7010 case CLASS_ROGUE:
7011 RandomSpells.push_back(71558);
7012 RandomSpells.push_back(71556);
7013 RandomSpells.push_back(71560);
7014 break;
7015 case CLASS_DRUID:
7016 RandomSpells.push_back(71561);
7017 RandomSpells.push_back(71556);
7018 RandomSpells.push_back(71560);
7019 break;
7020 case CLASS_HUNTER:
7021 RandomSpells.push_back(71558);
7022 RandomSpells.push_back(71559);
7023 RandomSpells.push_back(71556);
7024 break;
7025 default:
7026 return false;
7027 }
7028 if (RandomSpells.empty()) // shouldn't happen
7029 return false;
7030
7031 uint8 rand_spell = irand(0, (RandomSpells.size() - 1));
7032 CastSpell(target, RandomSpells[rand_spell], true, castItem, triggeredByAura, originalCaster);
7033 break;
7034 }
7035 // Freya, Petrified Bark
7036 case 62933:
7037 case 62337:
7038 {
7039 if (!victim)
7040 return false;
7041
7042 int32 dmg = damage;
7043 victim->CastCustomSpell(this, 62379, &dmg, 0, 0, true);
7044 return true;
7045 }
7046 // Trial of the Champion, Earth Shield
7047 case 67534:
7048 {
7049 const int32 dmg = (int32)damage;
7050 CastCustomSpell(this, 67535, &dmg, nullptr, nullptr, true, 0, triggeredByAura, triggeredByAura->GetCasterGUID());
7051 return true;
7052 }
7053 // Trial of the Crusader, Faction Champions, Retaliation
7054 case 65932:
7055 {
7056 // check attack comes not from behind
7057 if (!victim || !HasInArc(M_PI, victim))
7058 return false;
7059
7060 triggered_spell_id = 65934;
7061 break;
7062 }
7063 // Pit of Saron, Tyrannus, Overlord's Brand
7064 case 69172: // everything except for DoTs
7065 {
7066 if (!target)
7067 return false;
7068 if (Unit* caster = triggeredByAura->GetCaster())
7069 {
7071 {
7072 int32 dmg = 5.5f * damage;
7073 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7074 }
7075 else
7076 {
7077 if (caster->GetVictim())
7078 {
7079 int32 dmg = damage;
7080 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7081 }
7082 }
7083 }
7084 return true;
7085 }
7086 // Pit of Saron, Tyrannus, Overlord's Brand
7087 case 69173: // only DoTs
7088 {
7089 if (!target)
7090 return false;
7091 if (Unit* caster = triggeredByAura->GetCaster())
7092 {
7093 if (procEx & PROC_EX_INTERNAL_HOT)
7094 {
7095 int32 dmg = 5.5f * damage;
7096 target->CastCustomSpell(caster, 69190, &dmg, 0, 0, true);
7097 }
7098 else
7099 {
7100 if (caster->GetVictim())
7101 {
7102 int32 dmg = damage;
7103 target->CastCustomSpell(caster->GetVictim(), 69189, &dmg, 0, 0, true);
7104 }
7105 }
7106 }
7107 return true;
7108 }
7109 // Icecrown Citadel, Lady Deathwhisper, Vampiric Might
7110 case 70674:
7111 {
7112 if (Unit* caster = triggeredByAura->GetCaster())
7113 {
7114 int32 dmg = 3 * damage;
7115 caster->CastCustomSpell(caster, 70677, &dmg, 0, 0, true);
7116 }
7117 return true;
7118 }
7119 // Item: Purified Shard of the Gods
7120 case 69755:
7121 {
7122 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69733 : 69729);
7123 break;
7124 }
7125 // Item: Shiny Shard of the Gods
7126 case 69739:
7127 {
7128 triggered_spell_id = ((procFlag & PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS) ? 69734 : 69730);
7129 break;
7130 }
7131 // VoA: Meteor Fists koralon
7132 case 66725:
7133 case 68161:
7134 {
7135 triggered_spell_id = 66765; // handled by spell_difficulty
7136 break;
7137 }
7138 }
7139 break;
7140 }
7141 case SPELLFAMILY_MAGE:
7142 {
7143 // Magic Absorption
7144 if (dummySpell->SpellIconID == 459) // only this spell has SpellIconID == 459 and dummy aura
7145 {
7147 return false;
7148
7149 // mana reward
7150 basepoints0 = CalculatePct(int32(GetMaxPower(POWER_MANA)), triggerAmount);
7151 target = this;
7152 triggered_spell_id = 29442;
7153 break;
7154 }
7155 // Hot Streak
7156 if (dummySpell->SpellIconID == 2999)
7157 {
7158 if (effIndex != 0)
7159 return false;
7160 AuraEffect* counter = triggeredByAura->GetBase()->GetEffect(EFFECT_1);
7161 if (!counter)
7162 return true;
7163
7164 // Count spell criticals in a row in second aura
7165 if (procEx & PROC_EX_CRITICAL_HIT)
7166 {
7167 counter->SetAmount(counter->GetAmount() * 2);
7168 if (counter->GetAmount() < 100) // not enough
7169 return true;
7170 // Crititcal counted -> roll chance
7171 if (roll_chance_i(triggerAmount))
7172 CastSpell(this, 48108, true, castItem, triggeredByAura);
7173 }
7174 counter->SetAmount(25);
7175 return true;
7176 }
7177 // Incanter's Regalia set (add trigger chance to Mana Shield)
7178 if (dummySpell->SpellFamilyFlags[0] & 0x8000)
7179 {
7180 if (!IsPlayer())
7181 return false;
7182
7183 target = this;
7184 triggered_spell_id = 37436;
7185 break;
7186 }
7187 switch (dummySpell->Id)
7188 {
7189 // Glyph of Polymorph
7190 case 56375:
7191 {
7192 if (!target)
7193 return false;
7194 target->RemoveAurasByType(SPELL_AURA_PERIODIC_DAMAGE, ObjectGuid::Empty, target->GetAura(32409)); // SW:D shall not be removed.
7197 return true;
7198 }
7199 // Glyph of Icy Veins
7200 case 56374:
7201 {
7204 return true;
7205 }
7206 // Glyph of Ice Block
7207 case 56372:
7208 {
7209 Player* player = ToPlayer();
7210 if (!player)
7211 return false;
7212
7213 SpellCooldowns const cooldowns = player->GetSpellCooldowns();
7214 // remove cooldowns on all ranks of Frost Nova
7215 for (SpellCooldowns::const_iterator itr = cooldowns.begin(); itr != cooldowns.end(); ++itr)
7216 {
7217 SpellInfo const* cdSpell = sSpellMgr->GetSpellInfo(itr->first);
7218 // Frost Nova
7219 if (cdSpell && cdSpell->SpellFamilyName == SPELLFAMILY_MAGE
7220 && cdSpell->SpellFamilyFlags[0] & 0x00000040)
7221 player->RemoveSpellCooldown(cdSpell->Id, true);
7222 }
7223 break;
7224 }
7225 }
7226 break;
7227 }
7229 {
7230 // Second Wind
7231 if (dummySpell->SpellIconID == 1697)
7232 {
7233 // only for spells and hit/crit (trigger start always) and not start from self casted spells (5530 Mace Stun Effect for example)
7234 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
7235 return false;
7236 // Need stun or root mechanic
7237 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_STUN))))
7238 return false;
7239
7240 switch (dummySpell->Id)
7241 {
7242 case 29838:
7243 triggered_spell_id = 29842;
7244 break;
7245 case 29834:
7246 triggered_spell_id = 29841;
7247 break;
7248 case 42770:
7249 triggered_spell_id = 42771;
7250 break;
7251 default:
7252 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled spell id: {} (SW)", dummySpell->Id);
7253 return false;
7254 }
7255
7256 target = this;
7257 break;
7258 }
7259 break;
7260 }
7262 {
7263 switch (dummySpell->Id)
7264 {
7265 // Nightfall
7266 case 18094:
7267 case 18095:
7268 // Glyph of corruption
7269 case 56218:
7270 {
7271 target = this;
7272 triggered_spell_id = 17941;
7273 break;
7274 }
7275 // Soul Leech
7276 case 30293:
7277 case 30295:
7278 case 30296:
7279 {
7280 // Improved Soul Leech
7281 AuraEffectList const& SoulLeechAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
7282 for (Unit::AuraEffectList::const_iterator i = SoulLeechAuras.begin(); i != SoulLeechAuras.end(); ++i)
7283 {
7284 if ((*i)->GetId() == 54117 || (*i)->GetId() == 54118)
7285 {
7286 if ((*i)->GetEffIndex() != 0)
7287 continue;
7288 basepoints0 = int32((*i)->GetAmount());
7289 target = GetGuardianPet();
7290 if (target)
7291 {
7292 // regen mana for pet
7293 CastCustomSpell(target, 54607, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7294 }
7295 // regen mana for caster
7296 CastCustomSpell(this, 59117, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
7297 // Get second aura of spell for replenishment effect on party
7298 if (AuraEffect const* aurEff = (*i)->GetBase()->GetEffect(EFFECT_1))
7299 {
7300 // Replenishment - roll chance
7301 if (roll_chance_i(aurEff->GetAmount()))
7302 {
7303 CastSpell(this, 57669, true, castItem, triggeredByAura);
7304 }
7305 }
7306 break;
7307 }
7308 }
7309 // health
7310 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7311 target = this;
7312 triggered_spell_id = 30294;
7313 break;
7314 }
7315 // Shadowflame (Voidheart Raiment set bonus)
7316 case 37377:
7317 {
7318 triggered_spell_id = 37379;
7319 break;
7320 }
7321 // Pet Healing (Corruptor Raiment or Rift Stalker Armor)
7322 case 37381:
7323 {
7324 target = GetGuardianPet();
7325 if (!target)
7326 return false;
7327
7328 // heal amount
7329 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7330 triggered_spell_id = 37382;
7331 break;
7332 }
7333 // Shadowflame Hellfire (Voidheart Raiment set bonus)
7334 case 39437:
7335 {
7336 triggered_spell_id = 37378;
7337 break;
7338 }
7339 }
7340 break;
7341 }
7342 case SPELLFAMILY_PRIEST:
7343 {
7344 // Body and Soul
7345 if (dummySpell->SpellIconID == 2218)
7346 {
7347 // Proc only from Abolish desease on self cast
7348 if (procSpell->Id != 552 || victim != this || !roll_chance_i(triggerAmount))
7349 return false;
7350 triggered_spell_id = 64136;
7351 target = this;
7352 break;
7353 }
7354 switch (dummySpell->Id)
7355 {
7356 // Vampiric Embrace
7357 case 15286:
7358 {
7359 if (!victim || !victim->IsAlive() || procSpell->SpellFamilyFlags[1] & 0x80000)
7360 return false;
7361
7362 // heal amount
7363 int32 total = CalculatePct(int32(damage), triggerAmount);
7364 int32 team = total / 5;
7365 int32 self = total - team;
7366 CastCustomSpell(this, 15290, &team, &self, nullptr, true, castItem, triggeredByAura);
7367 return true; // no hidden cooldown
7368 }
7369 // Priest Tier 6 Trinket (Ashtongue Talisman of Acumen)
7370 case 40438:
7371 {
7372 // Shadow Word: Pain
7373 if (procSpell->SpellFamilyFlags[0] & 0x8000)
7374 triggered_spell_id = 40441;
7375 // Renew
7376 else if (procSpell->SpellFamilyFlags[0] & 0x40)
7377 triggered_spell_id = 40440;
7378 else
7379 return false;
7380
7381 target = this;
7382 break;
7383 }
7384 // Improved Shadowform
7385 case 47570:
7386 case 47569:
7387 {
7388 if (!roll_chance_i(triggerAmount))
7389 return false;
7390
7392 break;
7393 }
7394 // Glyph of Dispel Magic
7395 case 55677:
7396 {
7397 // Dispel Magic shares spellfamilyflag with abolish disease
7398 if (procSpell->SpellIconID != 74)
7399 return false;
7400 if (!target || !target->IsFriendlyTo(this))
7401 return false;
7402
7403 basepoints0 = int32(target->CountPctFromMaxHealth(triggerAmount));
7404 triggered_spell_id = 56131;
7405 break;
7406 }
7407 // Oracle Healing Bonus ("Garments of the Oracle" set)
7408 case 26169:
7409 {
7410 // heal amount
7411 basepoints0 = int32(CalculatePct(damage, 10));
7412 target = this;
7413 triggered_spell_id = 26170;
7414 break;
7415 }
7416 // Frozen Shadoweave (Shadow's Embrace set) warning! its not only priest set
7417 case 39372:
7418 {
7419 if (!procSpell || (procSpell->GetSchoolMask() & (SPELL_SCHOOL_MASK_FROST | SPELL_SCHOOL_MASK_SHADOW)) == 0)
7420 return false;
7421
7422 // heal amount
7423 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7424 target = this;
7425 triggered_spell_id = 39373;
7426 break;
7427 }
7428 // Greater Heal (Vestments of Faith (Priest Tier 3) - 4 pieces bonus)
7429 case 28809:
7430 {
7431 triggered_spell_id = 28810;
7432 break;
7433 }
7434 // Priest T10 Healer 2P Bonus
7435 case 70770:
7436 // Flash Heal
7437 if (procSpell->SpellFamilyFlags[0] & 0x800)
7438 {
7439 triggered_spell_id = 70772;
7440 SpellInfo const* blessHealing = sSpellMgr->GetSpellInfo(triggered_spell_id);
7441 if (!blessHealing || !victim)
7442 return false;
7443 basepoints0 = int32(CalculatePct(damage, triggerAmount) / (blessHealing->GetMaxDuration() / blessHealing->Effects[0].Amplitude));
7444 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
7445 return true;
7446 }
7447 break;
7448 }
7449 break;
7450 }
7451 case SPELLFAMILY_DRUID:
7452 {
7453 switch (dummySpell->Id)
7454 {
7455 // Glyph of Innervate
7456 case 54832:
7457 {
7458 if (procSpell->SpellIconID != 62)
7459 return false;
7460
7461 int32 mana_perc = triggeredByAura->GetSpellInfo()->Effects[triggeredByAura->GetEffIndex()].CalcValue();
7462 basepoints0 = int32(CalculatePct(GetCreatePowers(POWER_MANA), mana_perc) / 10);
7463 triggered_spell_id = 54833;
7464 target = this;
7465 break;
7466 }
7467 // Glyph of Starfire
7468 case 54845:
7469 {
7470 triggered_spell_id = 54846;
7471 break;
7472 }
7473 // Glyph of Shred
7474 case 54815:
7475 {
7476 if (!target)
7477 return false;
7478
7479 // try to find spell Rip on the target
7480 if (AuraEffect const* AurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x00800000, 0x0, 0x0, GetGUID()))
7481 {
7482 // Rip's max duration, note: spells which modifies Rip's duration also counted like Glyph of Rip
7483 uint32 CountMin = AurEff->GetBase()->GetMaxDuration();
7484
7485 // just Rip's max duration without other spells
7486 uint32 CountMax = AurEff->GetSpellInfo()->GetMaxDuration();
7487
7488 // add possible auras' and Glyph of Shred's max duration
7489 CountMax += 3 * triggerAmount * IN_MILLISECONDS; // Glyph of Shred -> +6 seconds
7490 CountMax += HasAura(54818) ? 4 * IN_MILLISECONDS : 0; // Glyph of Rip -> +4 seconds
7491 CountMax += HasAura(60141) ? 4 * IN_MILLISECONDS : 0; // Rip Duration/Lacerate Damage -> +4 seconds
7492
7493 // if min < max -> that means caster didn't cast 3 shred yet
7494 // so set Rip's duration and max duration
7495 if (CountMin < CountMax)
7496 {
7497 AurEff->GetBase()->SetDuration(AurEff->GetBase()->GetDuration() + triggerAmount * IN_MILLISECONDS);
7498 AurEff->GetBase()->SetMaxDuration(CountMin + triggerAmount * IN_MILLISECONDS);
7499 return true;
7500 }
7501 }
7502 // if not found Rip
7503 return false;
7504 }
7505 // Glyph of Rake
7506 case 54821:
7507 {
7508 if (procSpell->SpellVisual[0] == 750 && procSpell->Effects[1].ApplyAuraName == 3)
7509 {
7510 if (target && target->IsCreature())
7511 {
7512 triggered_spell_id = 54820;
7513 break;
7514 }
7515 }
7516 return false;
7517 }
7518 // Leader of the Pack
7519 case 24932:
7520 {
7521 if (triggerAmount <= 0)
7522 return false;
7523 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
7524 target = this;
7525 triggered_spell_id = 34299;
7526 if (triggeredByAura->GetCasterGUID() != GetGUID())
7527 break;
7528 int32 basepoints1 = CalculatePct(GetMaxPower(Powers(POWER_MANA)), triggerAmount * 2);
7529 // Improved Leader of the Pack
7530 // Check cooldown of heal spell cooldown
7531 if (IsPlayer() && !ToPlayer()->HasSpellCooldown(34299))
7532 CastCustomSpell(this, 68285, &basepoints1, 0, 0, true, 0, triggeredByAura);
7533 break;
7534 }
7535 // Healing Touch (Dreamwalker Raiment set)
7536 case 28719:
7537 {
7538 // mana back
7539 basepoints0 = int32(CalculatePct(spellProc->GetPowerCost(), 30));
7540 target = this;
7541 triggered_spell_id = 28742;
7542 break;
7543 }
7544 // Glyph of Rejuvenation
7545 case 54754:
7546 {
7547 if (!victim || !victim->HealthBelowPct(uint32(triggerAmount)))
7548 return false;
7549 basepoints0 = CalculatePct(int32(damage), triggerAmount);
7550 triggered_spell_id = 54755;
7551 break;
7552 }
7553 // Healing Touch Refund (Idol of Longevity trinket)
7554 case 28847:
7555 {
7556 target = this;
7557 triggered_spell_id = 28848;
7558 break;
7559 }
7560 // Mana Restore (Malorne Raiment set / Malorne Regalia set)
7561 case 37288:
7562 case 37295:
7563 {
7564 target = this;
7565 triggered_spell_id = 37238;
7566 break;
7567 }
7568 // Druid Tier 6 Trinket
7569 case 40442:
7570 {
7571 float chance;
7572
7573 // Starfire
7574 if (procSpell->SpellFamilyFlags[0] & 0x4)
7575 {
7576 triggered_spell_id = 40445;
7577 chance = 25.0f;
7578 }
7579 // Rejuvenation
7580 else if (procSpell->SpellFamilyFlags[0] & 0x10)
7581 {
7582 triggered_spell_id = 40446;
7583 chance = 25.0f;
7584 }
7585 // Mangle (Bear) and Mangle (Cat)
7586 else if (procSpell->SpellFamilyFlags[1] & 0x00000440)
7587 {
7588 triggered_spell_id = 40452;
7589 chance = 40.0f;
7590 }
7591 else
7592 return false;
7593
7594 if (!roll_chance_f(chance))
7595 return false;
7596
7597 target = this;
7598 break;
7599 }
7600 // Maim Interrupt
7601 case 44835:
7602 {
7603 // Deadly Interrupt Effect
7604 triggered_spell_id = 32747;
7605 break;
7606 }
7607 // Item - Druid T10 Restoration 4P Bonus (Rejuvenation)
7608 case 70664:
7609 {
7610 // xinef: proc only from normal Rejuvenation, and proc rejuvenation
7611 if (!victim || !procSpell || procSpell->SpellIconID != 64)
7612 return false;
7613
7614 Player* caster = ToPlayer();
7615 if (!caster)
7616 return false;
7617 if (!caster->GetGroup() && victim == this)
7618 return false;
7619
7620 CastCustomSpell(70691, SPELLVALUE_BASE_POINT0, damage, victim, true);
7621 return true;
7622 }
7623 }
7624 // Eclipse
7625 if (dummySpell->SpellIconID == 2856 && IsPlayer())
7626 {
7627 if (!procSpell || effIndex != 0)
7628 return false;
7629
7630 bool isWrathSpell = (procSpell->SpellFamilyFlags[0] & 1);
7631
7632 if (!roll_chance_f(dummySpell->ProcChance * (isWrathSpell ? 0.6f : 1.0f)))
7633 return false;
7634
7635 target = this;
7636 if (target->HasAura(isWrathSpell ? 48517 : 48518))
7637 return false;
7638
7639 triggered_spell_id = isWrathSpell ? 48518 : 48517;
7640 break;
7641 }
7642 [[fallthrough]];
7643 }
7644 case SPELLFAMILY_ROGUE:
7645 {
7646 switch (dummySpell->Id)
7647 {
7648 // Glyph of Backstab
7649 case 56800:
7650 {
7651 if (victim)
7652 if (AuraEffect* aurEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_ROGUE, 0x100000, 0, 0, GetGUID()))
7653 if (Aura* aur = aurEff->GetBase())
7654 if (!aur->IsRemoved() && aur->GetDuration() > 0)
7655 if ((aur->GetApplyTime() + aur->GetMaxDuration() / 1000 + 5) > (GameTime::GetGameTime().count() + aur->GetDuration() / 1000))
7656 {
7657 aur->SetDuration(aur->GetDuration() + 2000);
7658 return true;
7659 }
7660 return false;
7661 }
7662 // Deadly Throw Interrupt
7663 case 32748:
7664 {
7665 // Prevent cast Deadly Throw Interrupt on self from last effect (apply dummy) of Deadly Throw
7666 if (this == victim)
7667 return false;
7668
7669 triggered_spell_id = 32747;
7670 break;
7671 }
7672 }
7673 // Master of subtlety
7674 if (dummySpell->SpellIconID == 2114)
7675 {
7676 triggered_spell_id = 31665;
7677 basepoints0 = triggerAmount;
7678 break;
7679 }
7680 // Cut to the Chase
7681 if (dummySpell->SpellIconID == 2909)
7682 {
7683 // "refresh your Slice and Dice duration to its 5 combo point maximum"
7684 // lookup Slice and Dice
7685 if (AuraEffect const* aur = GetAuraEffect(SPELL_AURA_MOD_MELEE_HASTE, SPELLFAMILY_ROGUE, 0x40000, 0, 0))
7686 {
7687 aur->GetBase()->SetDuration(aur->GetSpellInfo()->GetMaxDuration(), true);
7688 return true;
7689 }
7690 return false;
7691 }
7692 // Deadly Brew
7693 else if (dummySpell->SpellIconID == 2963)
7694 {
7695 triggered_spell_id = 3409;
7696 break;
7697 }
7698 // Quick Recovery
7699 else if (dummySpell->SpellIconID == 2116)
7700 {
7701 if (!procSpell)
7702 return false;
7703
7704 // energy cost save
7705 basepoints0 = CalculatePct(int32(procSpell->ManaCost), triggerAmount);
7706 if (basepoints0 <= 0)
7707 return false;
7708
7709 target = this;
7710 triggered_spell_id = 31663;
7711 break;
7712 }
7713 break;
7714 }
7715 case SPELLFAMILY_HUNTER:
7716 {
7717 switch (dummySpell->SpellIconID)
7718 {
7719 case 2236: // Thrill of the Hunt
7720 {
7721 if (!procSpell)
7722 return false;
7723
7725
7726 // Disable charge drop because of Lock and Load
7727 if (spell)
7728 ToPlayer()->SetSpellModTakingSpell(spell, false);
7729
7730 // Explosive Shot
7731 if (procSpell->SpellFamilyFlags[2] & 0x200)
7732 {
7733 if (!victim)
7734 return false;
7735 if (AuraEffect const* pEff = victim->GetAuraEffect(SPELL_AURA_PERIODIC_DUMMY, SPELLFAMILY_HUNTER, 0x0, 0x80000000, 0x0, GetGUID()))
7736 basepoints0 = pEff->GetSpellInfo()->CalcPowerCost(this, SpellSchoolMask(pEff->GetSpellInfo()->SchoolMask)) * 4 / 10 / 3;
7737 }
7738 else
7739 basepoints0 = procSpell->CalcPowerCost(this, SpellSchoolMask(procSpell->SchoolMask)) * 4 / 10;
7740
7741 if (spell)
7742 ToPlayer()->SetSpellModTakingSpell(spell, true);
7743
7744 if (basepoints0 <= 0)
7745 return false;
7746
7747 target = this;
7748 triggered_spell_id = 34720;
7749 break;
7750 }
7751 case 3406: // Hunting Party
7752 {
7753 triggered_spell_id = 57669;
7754 target = this;
7755 break;
7756 }
7757 case 3560: // Rapid Recuperation
7758 {
7759 // This effect only from Rapid Killing (mana regen)
7760 if (!(procSpell->SpellFamilyFlags[1] & 0x01000000))
7761 return false;
7762
7763 target = this;
7764
7765 switch (dummySpell->Id)
7766 {
7767 case 53228: // Rank 1
7768 triggered_spell_id = 56654;
7769 break;
7770 case 53232: // Rank 2
7771 triggered_spell_id = 58882;
7772 break;
7773 }
7774 break;
7775 }
7776 }
7777
7778 switch (dummySpell->Id)
7779 {
7780 case 57870: // Glyph of Mend Pet
7781 {
7782 if (!victim)
7783 return false;
7784
7785 victim->CastSpell(victim, 57894, true, nullptr, nullptr, GetGUID());
7786 return true;
7787 }
7788 }
7789 break;
7790 }
7792 {
7793 // Light's Beacon - Beacon of Light
7794 if (dummySpell->Id == 53651)
7795 {
7796 if (!victim)
7797 return false;
7798
7799 // Do not proc from Glyph of Holy Light and Judgement of Light
7800 if (procSpell->Id == 20267 || procSpell->Id == 54968)
7801 {
7802 return false;
7803 }
7804
7805 Unit* beaconTarget = triggeredByAura->GetBase()->GetCaster();
7806 if (!beaconTarget || beaconTarget == this || !beaconTarget->GetAura(53563, victim->GetGUID()))
7807 return false;
7808
7809 basepoints0 = int32(damage);
7810 triggered_spell_id = procSpell->IsRankOf(sSpellMgr->GetSpellInfo(635)) ? 53652 : 53654;
7811
7812 victim->CastCustomSpell(beaconTarget, triggered_spell_id, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura, victim->GetGUID());
7813 return true;
7814 }
7815 // Judgements of the Wise
7816 if (dummySpell->SpellIconID == 3017)
7817 {
7818 target = this;
7819 triggered_spell_id = 31930;
7820 // replenishment
7821 CastSpell(this, 57669, true, castItem, triggeredByAura);
7822 break;
7823 }
7824 // Righteous Vengeance
7825 if (dummySpell->SpellIconID == 3025)
7826 {
7827 if (!victim)
7828 return false;
7829
7830 // 4 damage tick
7831 basepoints0 = triggerAmount * damage / 400;
7832 triggered_spell_id = 61840;
7833 // Add remaining ticks to damage done
7834 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
7835 return true;
7836 }
7837 // Sheath of Light
7838 if (dummySpell->SpellIconID == 3030)
7839 {
7840 // 4 healing tick
7841 basepoints0 = triggerAmount * damage / 400;
7842 triggered_spell_id = 54203;
7843 break;
7844 }
7845 switch (dummySpell->Id)
7846 {
7847 // Judgement of Light
7848 case 20185:
7849 {
7850 if (!victim || !victim->IsAlive())
7851 return false;
7852
7853 auto* caster = triggeredByAura->GetBase()->GetCaster();
7854 if (!caster || !victim->IsFriendlyTo(caster))
7855 return false;
7856
7857 // 2% of base health
7858 basepoints0 = int32(victim->CountPctFromMaxHealth(2));
7859 victim->CastCustomSpell(victim, 20267, &basepoints0, 0, 0, true, 0, triggeredByAura);
7860 return true;
7861 }
7862 // Judgement of Wisdom
7863 case 20186:
7864 {
7865 if (!victim || !victim->IsAlive() || !victim->HasActivePowerType(POWER_MANA))
7866 return false;
7867
7868 auto* caster = triggeredByAura->GetBase()->GetCaster();
7869 if (!caster || !victim->IsFriendlyTo(caster))
7870 return false;
7871
7872 // 2% of base mana
7873 basepoints0 = int32(CalculatePct(victim->GetCreateMana(), 2));
7874 victim->CastCustomSpell(victim, 20268, &basepoints0, nullptr, nullptr, true, 0, triggeredByAura);
7875 return true;
7876 }
7877 // Holy Power (Redemption Armor set)
7878 case 28789:
7879 {
7880 if (!victim)
7881 return false;
7882
7883 // Set class defined buff
7884 switch (victim->getClass())
7885 {
7886 case CLASS_PALADIN:
7887 case CLASS_PRIEST:
7888 case CLASS_SHAMAN:
7889 case CLASS_DRUID:
7890 triggered_spell_id = 28795; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
7891 break;
7892 case CLASS_MAGE:
7893 case CLASS_WARLOCK:
7894 triggered_spell_id = 28793; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
7895 break;
7896 case CLASS_HUNTER:
7897 case CLASS_ROGUE:
7898 triggered_spell_id = 28791; // Increases the friendly target's attack power by $s1 for $d.
7899 break;
7900 case CLASS_WARRIOR:
7901 triggered_spell_id = 28790; // Increases the friendly target's armor
7902 break;
7903 default:
7904 return false;
7905 }
7906 break;
7907 }
7908 // Seal of Vengeance (damage calc on apply aura)
7909 case 31801:
7910 {
7911 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7912 return false;
7913
7914 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7915 bool stacker = !procSpell || procSpell->Id == 53595;
7916 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7917 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7918
7919 if (!stacker && !damager)
7920 return false;
7921
7922 triggered_spell_id = 31803;
7923
7924 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7925 {
7926 if (aur->GetStackAmount() == 5)
7927 {
7928 if (stacker)
7929 aur->RefreshDuration();
7930 }
7931 }
7932
7933 CastSpell(victim, 42463, true, castItem, triggeredByAura); // Seal of Vengeance
7934
7935 if (!stacker)
7936 return false;
7937 break;
7938 }
7939 // Seal of Corruption
7940 case 53736:
7941 {
7942 if (effIndex != 0 || !victim) // effect 1, 2 used by seal unleashing code
7943 return false;
7944
7945 // At melee attack or Hammer of the Righteous spell damage considered as melee attack
7946 bool stacker = !procSpell || procSpell->Id == 53595;
7947 // spells with SPELL_DAMAGE_CLASS_MELEE excluding Judgements
7948 bool damager = procSpell && (procSpell->EquippedItemClass != -1 || (procSpell->SpellIconID == 243 && procSpell->SpellVisual[0] == 39));
7949
7950 if (!stacker && !damager)
7951 return false;
7952
7953 triggered_spell_id = 53742;
7954
7955 if (Aura* aur = victim->GetAura(triggered_spell_id, GetGUID()))
7956 {
7957 if (aur->GetStackAmount() == 5)
7958 {
7959 if (stacker)
7960 aur->RefreshDuration();
7961 }
7962 }
7963
7964 CastSpell(victim, 53739, true, castItem, triggeredByAura); // Seal of Corruption
7965
7966 if (!stacker)
7967 return false;
7968 break;
7969 }
7970 // Spiritual Attunement
7971 case 31785:
7972 case 33776:
7973 {
7974 // if healed by another unit (victim)
7975 if (this == victim)
7976 return false;
7977
7978 // dont allow non-positive dots to proc
7979 if (!procSpell || !procSpell->IsPositive())
7980 return false;
7981
7982 HealInfo const* healInfo = eventInfo.GetHealInfo();
7983 if (!healInfo)
7984 {
7985 return false;
7986 }
7987
7988 uint32 effectiveHeal = healInfo->GetEffectiveHeal();
7989 if (effectiveHeal)
7990 {
7991 // heal amount
7992 basepoints0 = int32(CalculatePct(effectiveHeal, triggerAmount));
7993 target = this;
7994
7995 if (basepoints0)
7996 triggered_spell_id = 31786;
7997 }
7998 break;
7999 }
8000 // Paladin Tier 6 Trinket (Ashtongue Talisman of Zeal)
8001 case 40470:
8002 {
8003 if (!procSpell)
8004 return false;
8005
8006 float chance = 0.0f;
8007
8008 // Flash of light/Holy light
8009 if (procSpell->SpellFamilyFlags[0] & 0xC0000000)
8010 {
8011 triggered_spell_id = 40471;
8012 chance = 15.0f;
8013 }
8014 // Judgement (any)
8015 else if (procSpell->SpellFamilyFlags[0] & 0x800000)
8016 {
8017 triggered_spell_id = 40472;
8018 chance = 50.0f;
8019 }
8020 else
8021 return false;
8022
8023 if (!roll_chance_f(chance))
8024 return false;
8025
8026 break;
8027 }
8028 // Glyph of Holy Light
8029 case 54937:
8030 {
8031 triggered_spell_id = 54968;
8032 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8033 break;
8034 }
8035 // Item - Paladin T8 Holy 2P Bonus
8036 case 64890:
8037 {
8038 triggered_spell_id = 64891;
8039 basepoints0 = triggerAmount * damage / 300;
8040 break;
8041 }
8042 case 71406: // Tiny Abomination in a Jar
8043 case 71545: // Tiny Abomination in a Jar (Heroic)
8044 {
8045 if (!victim || !victim->IsAlive())
8046 return false;
8047
8048 CastSpell(this, 71432, true, nullptr, triggeredByAura);
8049
8050 Aura const* dummy = GetAura(71432);
8051 if (!dummy || dummy->GetStackAmount() < (dummySpell->Id == 71406 ? 8 : 7))
8052 return false;
8053
8054 RemoveAurasDueToSpell(71432);
8055 triggered_spell_id = 71433; // default main hand attack
8056 // roll if offhand
8057 if (Player const* player = ToPlayer())
8058 if (player->GetWeaponForAttack(OFF_ATTACK, true) && urand(0, 1))
8059 triggered_spell_id = 71434;
8060 target = victim;
8061 break;
8062 }
8063 // Item - Icecrown 25 Normal Dagger Proc
8064 case 71880:
8065 {
8066 switch (getPowerType())
8067 {
8068 case POWER_MANA:
8069 triggered_spell_id = 71881;
8070 break;
8071 case POWER_RAGE:
8072 triggered_spell_id = 71883;
8073 break;
8074 case POWER_ENERGY:
8075 triggered_spell_id = 71882;
8076 break;
8077 case POWER_RUNIC_POWER:
8078 triggered_spell_id = 71884;
8079 break;
8080 default:
8081 return false;
8082 }
8083 break;
8084 }
8085 // Item - Icecrown 25 Heroic Dagger Proc
8086 case 71892:
8087 {
8088 switch (getPowerType())
8089 {
8090 case POWER_MANA:
8091 triggered_spell_id = 71888;
8092 break;
8093 case POWER_RAGE:
8094 triggered_spell_id = 71886;
8095 break;
8096 case POWER_ENERGY:
8097 triggered_spell_id = 71887;
8098 break;
8099 case POWER_RUNIC_POWER:
8100 triggered_spell_id = 71885;
8101 break;
8102 default:
8103 return false;
8104 }
8105 break;
8106 }
8107 }
8108 break;
8109 }
8110 case SPELLFAMILY_SHAMAN:
8111 {
8112 switch (dummySpell->Id)
8113 {
8114 // Tidal Force
8115 case 55198:
8116 {
8117 // Remove aura stack from caster
8118 RemoveAuraFromStack(55166);
8119 // drop charges
8120 return false;
8121 }
8122 // Totemic Power (The Earthshatterer set)
8123 case 28823:
8124 {
8125 if (!victim)
8126 return false;
8127
8128 // Set class defined buff
8129 switch (victim->getClass())
8130 {
8131 case CLASS_PALADIN:
8132 case CLASS_PRIEST:
8133 case CLASS_SHAMAN:
8134 case CLASS_DRUID:
8135 triggered_spell_id = 28824; // Increases the friendly target's mana regeneration by $s1 per 5 sec. for $d.
8136 break;
8137 case CLASS_MAGE:
8138 case CLASS_WARLOCK:
8139 triggered_spell_id = 28825; // Increases the friendly target's spell damage and healing by up to $s1 for $d.
8140 break;
8141 case CLASS_HUNTER:
8142 case CLASS_ROGUE:
8143 triggered_spell_id = 28826; // Increases the friendly target's attack power by $s1 for $d.
8144 break;
8145 case CLASS_WARRIOR:
8146 triggered_spell_id = 28827; // Increases the friendly target's armor
8147 break;
8148 default:
8149 return false;
8150 }
8151 break;
8152 }
8153 // Lesser Healing Wave (Totem of Flowing Water Relic)
8154 case 28849:
8155 {
8156 target = this;
8157 triggered_spell_id = 28850;
8158 break;
8159 }
8160 // Windfury Weapon (Passive) 1-8 Ranks
8161 case 33757:
8162 {
8163 Player* player = ToPlayer();
8164 if (!player || !castItem || !castItem->IsEquipped() || !victim || !victim->IsAlive())
8165 return false;
8166
8167 if (triggeredByAura->GetBase() && castItem->GetGUID() != triggeredByAura->GetBase()->GetCastItemGUID())
8168 return false;
8169
8170 WeaponAttackType attType = WeaponAttackType(player->GetAttackBySlot(castItem->GetSlot()));
8171 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8172 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8173 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8174 return false;
8175
8176 // Now amount of extra power stored in 1 effect of Enchant spell
8177 // Get it by item enchant id
8178 uint32 spellId;
8180 {
8181 case 283:
8182 spellId = 8232;
8183 break; // 1 Rank
8184 case 284:
8185 spellId = 8235;
8186 break; // 2 Rank
8187 case 525:
8188 spellId = 10486;
8189 break; // 3 Rank
8190 case 1669:
8191 spellId = 16362;
8192 break; // 4 Rank
8193 case 2636:
8194 spellId = 25505;
8195 break; // 5 Rank
8196 case 3785:
8197 spellId = 58801;
8198 break; // 6 Rank
8199 case 3786:
8200 spellId = 58803;
8201 break; // 7 Rank
8202 case 3787:
8203 spellId = 58804;
8204 break; // 8 Rank
8205 default:
8206 {
8207 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non handled item enchantment (rank?) {} for spell id: {} (Windfury)",
8208 castItem->GetEnchantmentId(EnchantmentSlot(TEMP_ENCHANTMENT_SLOT)), dummySpell->Id);
8209 return false;
8210 }
8211 }
8212
8213 SpellInfo const* windfurySpellInfo = sSpellMgr->GetSpellInfo(spellId);
8214 if (!windfurySpellInfo)
8215 {
8216 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: non-existing spell id: {} (Windfury)", spellId);
8217 return false;
8218 }
8219
8220 int32 extra_attack_power = CalculateSpellDamage(victim, windfurySpellInfo, 1);
8221
8222 // Value gained from additional AP
8223 basepoints0 = int32(extra_attack_power / 14.0f * GetAttackTime(attType) / 1000);
8224
8225 if (procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8226 triggered_spell_id = 25504;
8227
8228 if (procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8229 triggered_spell_id = 33750;
8230
8231 // custom cooldown processing case
8232 if (player->HasSpellCooldown(dummySpell->Id))
8233 return false;
8234
8235 // apply cooldown before cast to prevent processing itself
8236 player->AddSpellCooldown(dummySpell->Id, 0, 3 * IN_MILLISECONDS);
8237
8238 // Attack Twice
8239 for (uint32 i = 0; i < 2; ++i)
8240 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8241
8242 return true;
8243 }
8244 // Shaman Tier 6 Trinket
8245 case 40463:
8246 {
8247 if (!procSpell)
8248 return false;
8249
8250 float chance;
8251 if (procSpell->SpellFamilyFlags[0] & 0x1)
8252 {
8253 triggered_spell_id = 40465; // Lightning Bolt
8254 chance = 15.0f;
8255 }
8256 else if (procSpell->SpellFamilyFlags[0] & 0x80)
8257 {
8258 triggered_spell_id = 40465; // Lesser Healing Wave
8259 chance = 10.0f;
8260 }
8261 else if (procSpell->SpellFamilyFlags[1] & 0x00000010)
8262 {
8263 triggered_spell_id = 40466; // Stormstrike
8264 chance = 50.0f;
8265 }
8266 else
8267 return false;
8268
8269 if (!roll_chance_f(chance))
8270 return false;
8271
8272 target = this;
8273 break;
8274 }
8275 // Glyph of Healing Wave
8276 case 55440:
8277 {
8278 // Not proc from self heals
8279 if (this == victim)
8280 return false;
8281 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8282 target = this;
8283 triggered_spell_id = 55533;
8284 break;
8285 }
8286 // Spirit Hunt
8287 case 58877:
8288 {
8289 // Cast on owner
8290 target = GetOwner();
8291 if (!target)
8292 return false;
8293 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8294 triggered_spell_id = 58879;
8295 // Heal wolf
8296 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8297 break;
8298 }
8299 // Shaman T9 Elemental 4P Bonus
8300 case 67228:
8301 {
8302 // Lava Burst
8303 if (procSpell->SpellFamilyFlags[1] & 0x1000)
8304 {
8305 triggered_spell_id = 71824;
8306 SpellInfo const* triggeredSpell = sSpellMgr->GetSpellInfo(triggered_spell_id);
8307 if (!triggeredSpell)
8308 return false;
8309 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (triggeredSpell->GetMaxDuration() / triggeredSpell->Effects[0].Amplitude);
8310 }
8311 break;
8312 }
8313 // Item - Shaman T10 Elemental 4P Bonus
8314 case 70817:
8315 {
8316 if (!target)
8317 return false;
8318 // try to find spell Flame Shock on the target
8319 if (AuraEffect const* aurEff = target->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0x0, 0x0, GetGUID()))
8320 {
8321 Aura* flameShock = aurEff->GetBase();
8322 int32 extraTime = 2 * aurEff->GetAmplitude();
8323 flameShock->SetMaxDuration(flameShock->GetMaxDuration() + extraTime);
8324 flameShock->SetDuration(flameShock->GetDuration() + extraTime);
8325
8326 return true;
8327 }
8328 // if not found Flame Shock
8329 return false;
8330 }
8331 break;
8332 }
8333 // Frozen Power
8334 if (dummySpell->SpellIconID == 3780)
8335 {
8336 if (!target)
8337 return false;
8338 if (GetDistance(target) < 15.0f)
8339 return false;
8340 float chance = (float)triggerAmount;
8341 if (!roll_chance_f(chance))
8342 return false;
8343
8344 triggered_spell_id = 63685;
8345 break;
8346 }
8347 // Ancestral Awakening
8348 if (dummySpell->SpellIconID == 3065)
8349 {
8350 triggered_spell_id = 52759;
8351 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8352 target = this;
8353 break;
8354 }
8355 // Flametongue Weapon (Passive)
8356 if (dummySpell->SpellFamilyFlags[0] & 0x200000)
8357 {
8358 if (!IsPlayer() || !victim || !victim->IsAlive() || !castItem || !castItem->IsEquipped())
8359 return false;
8360
8362 if ((attType != BASE_ATTACK && attType != OFF_ATTACK)
8363 || (attType == BASE_ATTACK && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8364 || (attType == OFF_ATTACK && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK))
8365 return false;
8366
8367 float fire_onhit = float(CalculatePct(dummySpell->Effects[EFFECT_0]. CalcValue(), 1.0f));
8368
8369 float add_spellpower = (float)(SpellBaseDamageBonusDone(SPELL_SCHOOL_MASK_FIRE)
8371
8372 // 1.3speed = 5%, 2.6speed = 10%, 4.0 speed = 15%, so, 1.0speed = 3.84%
8373 ApplyPct(add_spellpower, 3.84f);
8374
8375 // Enchant on Off-Hand and ready?
8376 if (castItem->GetSlot() == EQUIPMENT_SLOT_OFFHAND && procFlag & PROC_FLAG_DONE_OFFHAND_ATTACK)
8377 {
8378 float BaseWeaponSpeed = GetAttackTime(OFF_ATTACK) / 1000.0f;
8379
8380 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8381 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8382 triggered_spell_id = 10444;
8383 }
8384
8385 // Enchant on Main-Hand and ready?
8386 else if (castItem->GetSlot() == EQUIPMENT_SLOT_MAINHAND && procFlag & PROC_FLAG_DONE_MAINHAND_ATTACK)
8387 {
8388 float BaseWeaponSpeed = GetAttackTime(BASE_ATTACK) / 1000.0f;
8389
8390 // Value1: add the tooltip damage by swingspeed + Value2: add spelldmg by swingspeed
8391 basepoints0 = int32((fire_onhit * BaseWeaponSpeed) + (add_spellpower * BaseWeaponSpeed));
8392 triggered_spell_id = 10444;
8393 }
8394
8395 // If not ready, we should return, shouldn't we?!
8396 else
8397 return false;
8398
8399 CastCustomSpell(victim, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
8400 return true;
8401 }
8402 // Improved Water Shield
8403 if (dummySpell->SpellIconID == 2287)
8404 {
8405 if (!procSpell)
8406 return false;
8407
8408 // Default chance for Healing Wave and Riptide
8409 float chance = (float)triggeredByAura->GetAmount();
8410
8411 if (procSpell->SpellFamilyFlags[0] & 0x80)
8412 // Lesser Healing Wave - 0.6 of default
8413 chance *= 0.6f;
8414 else if (procSpell->SpellFamilyFlags[0] & 0x100)
8415 // Chain heal - 0.3 of default
8416 chance *= 0.3f;
8417
8418 if (!roll_chance_f(chance))
8419 return false;
8420
8421 // Water Shield
8422 if (AuraEffect const* aurEff = GetAuraEffect(SPELL_AURA_PROC_TRIGGER_SPELL, SPELLFAMILY_SHAMAN, 0, 0x00000020, 0))
8423 {
8424 uint32 spell = aurEff->GetSpellInfo()->Effects[aurEff->GetEffIndex()].TriggerSpell;
8425 CastSpell(this, spell, true, castItem, triggeredByAura);
8426 return true;
8427 }
8428 return false;
8429 }
8430 // Lightning Overload
8431 if (dummySpell->SpellIconID == 2018) // only this spell have SpellFamily Shaman SpellIconID == 2018 and dummy aura
8432 {
8433 if (!procSpell || !IsPlayer() || !victim)
8434 return false;
8435
8436 uint32 spell = 45284;
8437
8438 // chain lightning only procs 1/3 of the time
8439 if (procSpell->SpellFamilyFlags[0] & 0x2)
8440 {
8441 if (!roll_chance_i(33))
8442 return false;
8443 spell = 45297;
8444 }
8445
8446 if (procEx & PROC_EX_CRITICAL_HIT)
8447 damage /= 2;
8448
8449 // do not reduce damage-spells have correct basepoints
8450 damage /= 2;
8451 int32 dmg = damage;
8452
8453 // Cast
8454 CastCustomSpell(victim, spell, &dmg, 0, 0, true, castItem, triggeredByAura);
8455 return true;
8456 }
8457 // Static Shock
8458 if (dummySpell->SpellIconID == 3059)
8459 {
8460 // Lightning Shield
8462 {
8463 uint32 spell = sSpellMgr->GetSpellWithRank(26364, aurEff->GetSpellInfo()->GetRank());
8464 CastSpell(target, spell, true, castItem, triggeredByAura);
8465 aurEff->GetBase()->DropCharge();
8466 return true;
8467 }
8468 return false;
8469 }
8470 break;
8471 }
8473 {
8474 // Improved Blood Presence
8475 if (dummySpell->SpellIconID == 2636)
8476 {
8477 if (!IsPlayer())
8478 return false;
8479 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8480 break;
8481 }
8482 // Butchery
8483 if (dummySpell->SpellIconID == 2664)
8484 {
8485 basepoints0 = triggerAmount;
8486 triggered_spell_id = 50163;
8487 target = this;
8488 break;
8489 }
8490 // Mark of Blood
8491 if (dummySpell->Id == 49005)
8492 {
8494 triggered_spell_id = 61607;
8495 break;
8496 }
8497 // Unholy Blight
8498 if (dummySpell->Id == 49194)
8499 {
8500 triggered_spell_id = 50536;
8501 SpellInfo const* unholyBlight = sSpellMgr->GetSpellInfo(triggered_spell_id);
8502 if (!unholyBlight || !victim)
8503 return false;
8504
8505 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8506
8507 //Glyph of Unholy Blight
8508 if (AuraEffect* glyph = GetAuraEffect(63332, 0))
8509 AddPct(basepoints0, glyph->GetAmount());
8510
8511 basepoints0 = basepoints0 / (unholyBlight->GetMaxDuration() / unholyBlight->Effects[0].Amplitude);
8512 victim->CastDelayedSpellWithPeriodicAmount(this, triggered_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
8513 return true;
8514 }
8515 // Vendetta
8516 if (dummySpell->SpellFamilyFlags[0] & 0x10000)
8517 {
8518 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
8519 triggered_spell_id = 50181;
8520 target = this;
8521 break;
8522 }
8523 // Necrosis
8524 if (dummySpell->SpellIconID == 2709)
8525 {
8526 basepoints0 = CalculatePct(int32(damage), triggerAmount);
8527 triggered_spell_id = 51460;
8528 break;
8529 }
8530 // Threat of Thassarian
8531 if (dummySpell->SpellIconID == 2023)
8532 {
8533 // Must Dual Wield
8534 if (!procSpell || !HasOffhandWeaponForAttack())
8535 return false;
8536 // Chance as basepoints for dummy aura
8537 if (!roll_chance_i(triggerAmount))
8538 return false;
8539
8540 switch (procSpell->Id)
8541 {
8542 // Obliterate
8543 case 49020:
8544 triggered_spell_id = 66198;
8545 break; // Rank 1
8546 case 51423:
8547 triggered_spell_id = 66972;
8548 break; // Rank 2
8549 case 51424:
8550 triggered_spell_id = 66973;
8551 break; // Rank 3
8552 case 51425:
8553 triggered_spell_id = 66974;
8554 break; // Rank 4
8555
8556 // Frost Strike
8557 case 49143:
8558 triggered_spell_id = 66196;
8559 break; // Rank 1
8560 case 51416:
8561 triggered_spell_id = 66958;
8562 break; // Rank 2
8563 case 51417:
8564 triggered_spell_id = 66959;
8565 break; // Rank 3
8566 case 51418:
8567 triggered_spell_id = 66960;
8568 break; // Rank 4
8569 case 51419:
8570 triggered_spell_id = 66961;
8571 break; // Rank 5
8572 case 55268:
8573 triggered_spell_id = 66962;
8574 break; // Rank 6
8575
8576 // Plague Strike
8577 case 45462:
8578 triggered_spell_id = 66216;
8579 break; // Rank 1
8580 case 49917:
8581 triggered_spell_id = 66988;
8582 break; // Rank 2
8583 case 49918:
8584 triggered_spell_id = 66989;
8585 break; // Rank 3
8586 case 49919:
8587 triggered_spell_id = 66990;
8588 break; // Rank 4
8589 case 49920:
8590 triggered_spell_id = 66991;
8591 break; // Rank 5
8592 case 49921:
8593 triggered_spell_id = 66992;
8594 break; // Rank 6
8595
8596 // Death Strike
8597 case 49998:
8598 triggered_spell_id = 66188;
8599 break; // Rank 1
8600 case 49999:
8601 triggered_spell_id = 66950;
8602 break; // Rank 2
8603 case 45463:
8604 triggered_spell_id = 66951;
8605 break; // Rank 3
8606 case 49923:
8607 triggered_spell_id = 66952;
8608 break; // Rank 4
8609 case 49924:
8610 triggered_spell_id = 66953;
8611 break; // Rank 5
8612
8613 // Rune Strike
8614 case 56815:
8615 triggered_spell_id = 66217;
8616 break; // Rank 1
8617
8618 // Blood Strike
8619 case 45902:
8620 triggered_spell_id = 66215;
8621 break; // Rank 1
8622 case 49926:
8623 triggered_spell_id = 66975;
8624 break; // Rank 2
8625 case 49927:
8626 triggered_spell_id = 66976;
8627 break; // Rank 3
8628 case 49928:
8629 triggered_spell_id = 66977;
8630 break; // Rank 4
8631 case 49929:
8632 triggered_spell_id = 66978;
8633 break; // Rank 5
8634 case 49930:
8635 triggered_spell_id = 66979;
8636 break; // Rank 6
8637 default:
8638 return false;
8639 }
8640
8641 // This should do, restore spell mod so next attack can also use this!
8642 // crit chance for first strike is already computed
8643 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 51124, nullptr); // Killing Machine
8644 ToPlayer()->RestoreSpellMods(m_currentSpells[CURRENT_GENERIC_SPELL], 49796, nullptr); // Deathchill
8645
8646 // Xinef: Somehow basepoints are divided by 2 which is later divided by 2 (offhand multiplier)
8647 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8648 if (triggerEntry->SchoolMask & SPELL_SCHOOL_MASK_NORMAL)
8649 basepoints0 = triggerEntry->Effects[EFFECT_0].BasePoints * 2;
8650
8651 SetCantProc(true);
8652 if (basepoints0)
8653 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8654 else
8655 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8656 SetCantProc(false);
8657 return true;
8658 }
8659 // Runic Power Back on Snare/Root
8660 if (dummySpell->Id == 61257)
8661 {
8662 // only for spells and hit/crit (trigger start always) and not start from self casted spells
8663 if (procSpell == 0 || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
8664 return false;
8665 // Need snare or root mechanic
8666 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_ROOT) | (1 << MECHANIC_SNARE))))
8667 return false;
8668 triggered_spell_id = 61258;
8669 target = this;
8670 break;
8671 }
8672 // Sudden Doom
8673 if (dummySpell->SpellIconID == 1939 && IsPlayer())
8674 {
8675 SpellChainNode const* chain = nullptr;
8676 // get highest rank of the Death Coil spell
8677 PlayerSpellMap const& sp_list = ToPlayer()->GetSpellMap();
8678 for (PlayerSpellMap::const_iterator itr = sp_list.begin(); itr != sp_list.end(); ++itr)
8679 {
8680 // check if shown in spell book
8681 if (!itr->second->Active || !itr->second->IsInSpec(ToPlayer()->GetActiveSpec()) || itr->second->State == PLAYERSPELL_REMOVED)
8682 continue;
8683
8684 SpellInfo const* spellProto = sSpellMgr->GetSpellInfo(itr->first);
8685 if (!spellProto)
8686 continue;
8687
8688 if (spellProto->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT
8689 && spellProto->SpellFamilyFlags[0] & 0x2000)
8690 {
8691 SpellChainNode const* newChain = sSpellMgr->GetSpellChainNode(itr->first);
8692
8693 // No chain entry or entry lower than found entry
8694 if (!chain || !newChain || (chain->rank < newChain->rank))
8695 {
8696 triggered_spell_id = itr->first;
8697 chain = newChain;
8698 }
8699 else
8700 continue;
8701 // Found spell is last in chain - do not need to look more
8702 // Optimisation for most common case
8703 if (chain && chain->last->Id == itr->first)
8704 break;
8705 }
8706 }
8707 }
8708 break;
8709 }
8710 case SPELLFAMILY_POTION:
8711 {
8712 // alchemist's stone
8713 if (dummySpell->Id == 17619)
8714 {
8715 if (procSpell->SpellFamilyName == SPELLFAMILY_POTION)
8716 {
8717 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; i++)
8718 {
8719 if (procSpell->Effects[i].Effect == SPELL_EFFECT_HEAL)
8720 {
8721 triggered_spell_id = 21399;
8722 }
8723 else if (procSpell->Effects[i].Effect == SPELL_EFFECT_ENERGIZE)
8724 {
8725 triggered_spell_id = 21400;
8726 }
8727 else
8728 continue;
8729
8730 basepoints0 = int32(CalculateSpellDamage(this, procSpell, i) * 0.4f);
8731 CastCustomSpell(this, triggered_spell_id, &basepoints0, nullptr, nullptr, true, nullptr, triggeredByAura);
8732 }
8733 return true;
8734 }
8735 }
8736 break;
8737 }
8738 case SPELLFAMILY_PET:
8739 {
8740 switch (dummySpell->SpellIconID)
8741 {
8742 // Guard Dog
8743 case 201:
8744 {
8745 if (!victim)
8746 return false;
8747
8748 triggered_spell_id = 54445;
8749 target = this;
8750 float addThreat = float(CalculatePct(procSpell->Effects[0].CalcValue(this), triggerAmount));
8751 victim->AddThreat(this, addThreat);
8752 break;
8753 }
8754 // Silverback
8755 case 1582:
8756 triggered_spell_id = dummySpell->Id == 62765 ? 62801 : 62800;
8757 target = this;
8758 break;
8759 }
8760 break;
8761 }
8762 default:
8763 break;
8764 }
8765
8766 // if not handled by custom case, get triggered spell from dummySpell proto
8767 if (!triggered_spell_id)
8768 triggered_spell_id = dummySpell->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
8769
8770 // processed charge only counting case
8771 if (!triggered_spell_id)
8772 return true;
8773
8774 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
8775 if (!triggerEntry)
8776 {
8777 LOG_ERROR("entities.unit", "Unit::HandleDummyAuraProc: Spell {} has non-existing triggered spell {}", dummySpell->Id, triggered_spell_id);
8778 return false;
8779 }
8780
8781 if (cooldown_spell_id == 0)
8782 cooldown_spell_id = triggered_spell_id;
8783
8784 if (cooldown)
8785 {
8786 if (HasSpellCooldown(cooldown_spell_id))
8787 return false;
8788
8789 AddSpellCooldown(cooldown_spell_id, 0, cooldown);
8790 }
8791
8792 if (basepoints0)
8793 CastCustomSpell(target, triggered_spell_id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura, originalCaster);
8794 else
8795 CastSpell(target, triggered_spell_id, true, castItem, triggeredByAura, originalCaster);
8796
8797 return true;
8798}
constexpr auto IN_MILLISECONDS
Definition Common.h:53
static First const & RAND(First const &first, Second const &second, Rest const &... rest)
Definition CreatureAIImpl.h:25
EnchantmentSlot
Definition Item.h:168
@ TEMP_ENCHANTMENT_SLOT
Definition Item.h:170
std::map< uint32, SpellCooldown > SpellCooldowns
Definition Player.h:209
std::unordered_map< uint32, PlayerSpell * > PlayerSpellMap
Definition Player.h:194
@ EQUIPMENT_SLOT_MAINHAND
Definition Player.h:697
@ PLAYERSPELL_REMOVED
Definition Player.h:122
int32 irand(int32 min, int32 max)
Definition Random.cpp:37
@ SPELL_EFFECT_ENERGIZE
Definition SharedDefines.h:808
@ LANG_UNIVERSAL
Definition SharedDefines.h:735
@ CLASS_DRUID
Definition SharedDefines.h:151
@ CLASS_SHAMAN
Definition SharedDefines.h:147
@ CLASS_PRIEST
Definition SharedDefines.h:145
@ CLASS_WARLOCK
Definition SharedDefines.h:149
@ CLASS_MAGE
Definition SharedDefines.h:148
@ CLASS_PALADIN
Definition SharedDefines.h:142
@ CLASS_ROGUE
Definition SharedDefines.h:144
@ MECHANIC_STUN
Definition SharedDefines.h:1337
@ MECHANIC_ROOT
Definition SharedDefines.h:1332
@ MECHANIC_SNARE
Definition SharedDefines.h:1336
@ SPELLFAMILY_WARLOCK
Definition SharedDefines.h:3788
@ SPELLFAMILY_PALADIN
Definition SharedDefines.h:3793
@ SPELLFAMILY_HUNTER
Definition SharedDefines.h:3792
@ SPELLFAMILY_POTION
Definition SharedDefines.h:3796
@ SPELLFAMILY_ROGUE
Definition SharedDefines.h:3791
@ SPELLFAMILY_DRUID
Definition SharedDefines.h:3790
@ SPELLFAMILY_PET
Definition SharedDefines.h:3800
@ REP_EXALTED
Definition SharedDefines.h:187
@ SPELL_SCHOOL_MASK_SHADOW
Definition SharedDefines.h:302
@ SPELL_SCHOOL_MASK_FIRE
Definition SharedDefines.h:299
@ SPELL_SCHOOL_MASK_FROST
Definition SharedDefines.h:301
@ SPELL_AURA_PROC_TRIGGER_SPELL
Definition SpellAuraDefines.h:105
@ SPELL_AURA_HASTE_SPELLS
Definition SpellAuraDefines.h:279
@ SPELL_AURA_MOD_MELEE_HASTE
Definition SpellAuraDefines.h:201
@ SPELL_AURA_MOD_DECREASE_SPEED
Definition SpellAuraDefines.h:96
@ SPELL_AURA_PERIODIC_DUMMY
Definition SpellAuraDefines.h:289
@ PROC_EX_INTERNAL_HOT
Definition SpellMgr.h:220
@ PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS
Definition SpellMgr.h:128
@ PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS
Definition SpellMgr.h:122
WeaponAttackType
Definition Unit.h:209
T ApplyPct(T &base, U pct)
Definition Util.h:73
Definition Unit.h:374
uint32 GetEffectiveHeal() const
Definition Unit.h:414
uint8 GetSlot() const
Definition Item.h:281
uint32 GetEnchantmentId(EnchantmentSlot slot) const
Definition Item.h:304
bool IsEquipped() const
Definition Item.cpp:789
void SetSpellModTakingSpell(Spell *spell, bool apply)
Definition Player.cpp:10054
void RestoreSpellMods(Spell *spell, uint32 ownerAuraId=0, Aura *aura=nullptr)
Definition Player.cpp:9902
bool HasSpellCooldown(uint32 spell_id) const override
Definition Player.cpp:16308
PlayerSpellMap const & GetSpellMap() const
Definition Player.h:1786
void AddSpellCooldown(uint32 spell_id, uint32 itemid, uint32 end_time, bool needSendToClient=false, bool forceSendToSpectator=false) override
Definition Player.cpp:11065
SpellCooldowns GetSpellCooldowns() const
Definition Player.h:2183
static uint8 GetAttackBySlot(uint8 slot)
Definition PlayerStorage.cpp:542
ReputationRank GetReputationRank(uint32 faction_id) const
Definition Player.cpp:5903
Unit * GetSelectedUnit() const
Definition Player.cpp:11516
void RemoveSpellCooldown(uint32 spell_id, bool update=false)
Definition Player.cpp:3543
void Say(std::string_view text, Language language, WorldObject const *=nullptr) override
Handles said message in regular chat based on declared language and in config pre-defined Range.
Definition Player.cpp:9369
Item * GetItemByGuid(ObjectGuid guid) const
Definition PlayerStorage.cpp:407
Spell * m_spellModTakingSpell
Definition Player.h:2567
uint32 ProcChance
Definition SpellInfo.h:356
SpellInfo const * GetSpellInfo() const
Definition Spell.h:579
int32 GetPowerCost() const
Definition Spell.h:580
uint32 GetCreatePowers(Powers power) const
Definition Unit.cpp:15736
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint8 reqEffMask=0) const
Definition Unit.cpp:5637
void RemoveAurasWithMechanic(uint32 mechanic_mask, AuraRemoveMode removemode=AURA_REMOVE_BY_DEFAULT, uint32 except=0)
Definition Unit.cpp:5309
int32 CalculateSpellDamage(Unit const *target, SpellInfo const *spellProto, uint8 effect_index, int32 const *basePoints=nullptr) const
Definition Unit.cpp:14941
void SetCantProc(bool apply)
Definition Unit.cpp:17358
bool HealthBelowPct(int32 pct) const
Definition Unit.h:1039
void RemoveAurasDueToSpell(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, uint8 reqEffMask=0, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition Unit.cpp:4965
int32 SpellBaseDamageBonusTaken(SpellSchoolMask schoolMask, bool isDoT=false)
Definition Unit.cpp:12058
bool IsFriendlyTo(Unit const *unit) const
Definition Unit.cpp:10302
int32 SpellBaseDamageBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12020
uint32 CountPctFromMaxHealth(int32 pct) const
Definition Unit.h:1044
void CastDelayedSpellWithPeriodicAmount(Unit *caster, uint32 spellId, AuraType auraType, int32 addAmount, uint8 effectIndex=0)
Definition Unit.cpp:20143
Powers getPowerType() const
Definition Unit.h:1054
void RemoveMovementImpairingAuras(bool withRoot)
Definition Unit.cpp:5290
Definition SpellMgr.h:554
SpellInfo const * last
Definition SpellMgr.h:558
uint8 rank
Definition SpellMgr.h:559
SpellInfo const * first
Definition SpellMgr.h:557

References AddPct(), Player::AddSpellCooldown(), AddSpellCooldown(), AddThreat(), ApplyPct(), AURA_REMOVE_BY_ENEMY_SPELL, BASE_ATTACK, SpellInfo::CalcPowerCost(), CalculatePct(), CalculateSpellDamage(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_HUNTER, CLASS_MAGE, CLASS_PALADIN, CLASS_PRIEST, CLASS_ROGUE, CLASS_SHAMAN, CLASS_WARLOCK, CLASS_WARRIOR, CountPctFromMaxHealth(), CURRENT_GENERIC_SPELL, EFFECT_0, EFFECT_1, SpellInfo::Effects, ObjectGuid::Empty, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, SpellInfo::EquippedItemClass, SpellChainNode::first, SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), Player::GetAttackBySlot(), GetAttackTime(), GetAura(), GetAuraEffect(), GetAuraEffectsByType(), AuraEffect::GetBase(), AuraEffect::GetCaster(), Aura::GetCaster(), AuraEffect::GetCasterGUID(), Aura::GetCastItemGUID(), Aura::GetCharges(), getClass(), GetCreateMana(), GetCreatePowers(), WorldObject::GetDistance(), Aura::GetDuration(), Aura::GetEffect(), HealInfo::GetEffectiveHeal(), AuraEffect::GetEffIndex(), Item::GetEnchantmentId(), GameTime::GetGameTime(), Player::GetGroup(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), ProcEventInfo::GetHealInfo(), Player::GetItemByGuid(), Aura::GetMaxDuration(), SpellInfo::GetMaxDuration(), GetMaxPower(), GetOwner(), Spell::GetPowerCost(), getPowerType(), ProcEventInfo::GetProcSpell(), Player::GetReputationRank(), SpellInfo::GetSchoolMask(), Player::GetSelectedUnit(), Item::GetSlot(), Player::GetSpellCooldowns(), AuraEffect::GetSpellInfo(), Player::GetSpellMap(), Aura::GetStackAmount(), GetVictim(), HasActivePowerType(), HasAura(), Position::HasInArc(), HasOffhandWeaponForAttack(), Player::HasSpellCooldown(), HasSpellCooldown(), HealthBelowPct(), SpellInfo::Id, IN_MILLISECONDS, irand(), IsAlive(), Object::IsCreature(), Item::IsEquipped(), IsFriendlyTo(), Object::IsPlayer(), SpellInfo::IsPositive(), SpellInfo::IsRankOf(), LANG_UNIVERSAL, SpellChainNode::last, LOG_ERROR, m_currentSpells, Player::m_spellModTakingSpell, SpellInfo::ManaCost, MAX_SPELL_EFFECTS, MECHANIC_ROOT, MECHANIC_SNARE, MECHANIC_STUN, OFF_ATTACK, PLAYERSPELL_REMOVED, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, PROC_EX_CRITICAL_HIT, PROC_EX_INTERNAL_HOT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_MAINHAND_ATTACK, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, SpellInfo::ProcChance, RAND(), SpellChainNode::rank, RemoveAuraFromStack(), RemoveAurasByType(), RemoveAurasDueToSpell(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), Player::RemoveSpellCooldown(), REP_EXALTED, Player::RestoreSpellMods(), roll_chance_f(), roll_chance_i(), Player::Say(), SpellInfo::SchoolMask, AuraEffect::SetAmount(), SetCantProc(), Aura::SetDuration(), Aura::SetMaxDuration(), Player::SetSpellModTakingSpell(), SPELL_AURA_DUMMY, SPELL_AURA_HASTE_SPELLS, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_DUMMY, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_LEECH, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_EFFECT_ENERGIZE, SPELL_EFFECT_HEAL, SPELL_SCHOOL_MASK_FIRE, SPELL_SCHOOL_MASK_FROST, SPELL_SCHOOL_MASK_NORMAL, SPELL_SCHOOL_MASK_SHADOW, SpellBaseDamageBonusDone(), SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PET, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, SPELLVALUE_BASE_POINT0, SpellInfo::SpellVisual, sSpellMgr, TEMP_ENCHANTMENT_SLOT, Object::ToPlayer(), and urand().

Referenced by ProcDamageAndSpellFor().

◆ HandleEmoteCommand()

void Unit::HandleEmoteCommand ( uint32  emoteId)
2027{
2029 packet.EmoteID = emoteId;
2030 packet.Guid = GetGUID();
2031 SendMessageToSet(packet.Write(), true);
2032}
Definition ChatPackets.h:29
WorldPacket const * Write() override
Definition ChatPackets.cpp:20
uint32 EmoteID
Definition ChatPackets.h:35
ObjectGuid Guid
Definition ChatPackets.h:36

References WorldPackets::Chat::Emote::EmoteID, Object::GetGUID(), WorldPackets::Chat::Emote::Guid, WorldObject::SendMessageToSet(), and WorldPackets::Chat::Emote::Write().

Referenced by npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_viscidus::DamageTaken(), DealMeleeDamage(), boss_twinemperorsAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), StandUpEvent::Execute(), PartyTimeEmoteEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), WorldSession::HandleEmoteOpcode(), spell_chapter5_return_to_capital::HandleHit(), npc_commandscript::HandleNpcSayCommand(), npc_commandscript::HandleNpcYellCommand(), WorldSession::HandleTextEmoteOpcode(), npc_maiev_illidan::IsSummonedBy(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), npc_sentinel_leader::MovementInform(), npc_sentinel_infiltrator::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_akama_illidan::MovementInform(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::MovementInform(), boss_felmyst::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), spell_gen_spectator_cheer_trigger::PrepareSpellScript(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), PetAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_felmyst::ScheduleGroundAbilities(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), CreatureTextMgr::SendEmote(), boss_grand_warlock_nethekurse::SetData(), npc_harrison_jones::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), boss_nightbane::TriggerHealthTakeOff(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_shenthul::npc_shenthulAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_highlord_tirion_fordring_lh::npc_highlord_tirion_fordringAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_valiance_keep_cannoneer::npc_valiance_keep_cannoneerAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_dancing_flames::npc_dancing_flamesAI::UpdateAI(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::UpdateAI(), npc_rocknot::npc_rocknotAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_taretha::npc_tarethaAI::WaypointReached(), npc_general_andorov::WaypointReached(), npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached(), npc_engineer_helice::npc_engineer_heliceAI::WaypointReached(), npc_maxx_a_million_escort::npc_maxx_a_million_escortAI::WaypointReached(), and npc_isla_starmane::npc_isla_starmaneAI::WaypointReached().

◆ HandleOverrideClassScriptAuraProc()

bool Unit::HandleOverrideClassScriptAuraProc ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  cooldown 
)
private
9923{
9924 int32 scriptId = triggeredByAura->GetMiscValue();
9925
9926 if (!victim || !victim->IsAlive())
9927 return false;
9928
9929 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9930 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9931
9932 uint32 triggered_spell_id = 0;
9933
9934 switch (scriptId)
9935 {
9936 case 836: // Improved Blizzard (Rank 1)
9937 {
9938 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9939 return false;
9940 triggered_spell_id = 12484;
9941 break;
9942 }
9943 case 988: // Improved Blizzard (Rank 2)
9944 {
9945 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9946 return false;
9947 triggered_spell_id = 12485;
9948 break;
9949 }
9950 case 989: // Improved Blizzard (Rank 3)
9951 {
9952 if (!procSpell || procSpell->SpellVisual[0] != 9487)
9953 return false;
9954 triggered_spell_id = 12486;
9955 break;
9956 }
9957 case 4533: // Dreamwalker Raiment 2 pieces bonus
9958 {
9959 // Chance 50%
9960 if (!roll_chance_i(50))
9961 return false;
9962
9963 switch (victim->getPowerType())
9964 {
9965 case POWER_MANA:
9966 triggered_spell_id = 28722;
9967 break;
9968 case POWER_RAGE:
9969 triggered_spell_id = 28723;
9970 break;
9971 case POWER_ENERGY:
9972 triggered_spell_id = 28724;
9973 break;
9974 default:
9975 return false;
9976 }
9977 break;
9978 }
9979 case 4537: // Dreamwalker Raiment 6 pieces bonus
9980 triggered_spell_id = 28750; // Blessing of the Claw
9981 break;
9982 case 5497: // Improved Mana Gems
9983 triggered_spell_id = 37445; // Mana Surge
9984 break;
9985 case 7010: // Revitalize - can proc on full hp target
9986 case 7011:
9987 case 7012:
9988 {
9989 if (!roll_chance_i(triggeredByAura->GetAmount()))
9990 return false;
9991 switch (victim->getPowerType())
9992 {
9993 case POWER_MANA:
9994 triggered_spell_id = 48542;
9995 break;
9996 case POWER_RAGE:
9997 triggered_spell_id = 48541;
9998 break;
9999 case POWER_ENERGY:
10000 triggered_spell_id = 48540;
10001 break;
10002 case POWER_RUNIC_POWER:
10003 triggered_spell_id = 48543;
10004 break;
10005 default:
10006 break;
10007 }
10008 break;
10009 }
10010 default:
10011 break;
10012 }
10013
10014 // not processed
10015 if (!triggered_spell_id)
10016 return false;
10017
10018 // standard non-dummy case
10019 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(triggered_spell_id);
10020
10021 if (!triggerEntry)
10022 {
10023 LOG_ERROR("entities.unit", "Unit::HandleOverrideClassScriptAuraProc: Spell {} triggering for class script id {}", triggered_spell_id, scriptId);
10024 return false;
10025 }
10026
10027 if (cooldown)
10028 {
10029 if (HasSpellCooldown(triggered_spell_id))
10030 return false;
10031
10032 AddSpellCooldown(triggered_spell_id, 0, cooldown);
10033 }
10034
10035 CastSpell(victim, triggered_spell_id, true, castItem, triggeredByAura);
10036
10037 return true;
10038}

References AddSpellCooldown(), CastSpell(), AuraEffect::GetAmount(), AuraEffect::GetBase(), Aura::GetCastItemGUID(), Player::GetItemByGuid(), AuraEffect::GetMiscValue(), getPowerType(), HasSpellCooldown(), IsAlive(), Object::IsPlayer(), LOG_ERROR, POWER_ENERGY, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, roll_chance_i(), SpellInfo::SpellVisual, sSpellMgr, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ HandleProcExtraAttackFor()

void Unit::HandleProcExtraAttackFor ( Unit victim,
uint32  count 
)
2787{
2788 while (count)
2789 {
2790 --count;
2791 AttackerStateUpdate(victim, BASE_ATTACK, true);
2792 }
2793}
void AttackerStateUpdate(Unit *victim, WeaponAttackType attType=BASE_ATTACK, bool extra=false, bool ignoreCasting=false)
Definition Unit.cpp:2591

References AttackerStateUpdate(), and BASE_ATTACK.

Referenced by Update().

◆ HandleProcTriggerSpell()

bool Unit::HandleProcTriggerSpell ( Unit victim,
uint32  damage,
AuraEffect triggeredByAura,
SpellInfo const *  procSpell,
uint32  procFlag,
uint32  procEx,
uint32  cooldown,
uint32  procPhase,
ProcEventInfo eventInfo 
)
private
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
8998{
8999 // Get triggered aura spell info
9000 SpellInfo const* auraSpellInfo = triggeredByAura->GetSpellInfo();
9001
9002 // Basepoints of trigger aura
9003 int32 triggerAmount = triggeredByAura->GetAmount();
9004
9005 // Set trigger spell id, target, custom basepoints
9006 uint32 trigger_spell_id = auraSpellInfo->Effects[triggeredByAura->GetEffIndex()].TriggerSpell;
9007
9008 Unit* target = nullptr;
9009 int32 basepoints0 = 0;
9010
9011 if (triggeredByAura->GetAuraType() == SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE)
9012 basepoints0 = triggerAmount;
9013
9014 Item* castItem = triggeredByAura->GetBase()->GetCastItemGUID() && IsPlayer()
9015 ? ToPlayer()->GetItemByGuid(triggeredByAura->GetBase()->GetCastItemGUID()) : nullptr;
9016
9017 // Try handle unknown trigger spells
9018 //if (sSpellMgr->GetSpellInfo(trigger_spell_id) == nullptr)
9019 {
9020 switch (auraSpellInfo->SpellFamilyName)
9021 {
9023 switch (auraSpellInfo->Id)
9024 {
9025 case 43820: // Charm of the Witch Doctor (Amani Charm of the Witch Doctor trinket)
9026 // Pct value stored in dummy
9027 if (!victim)
9028 return false;
9029 basepoints0 = victim->GetCreateHealth() * auraSpellInfo->Effects[1].CalcValue() / 100;
9030 target = victim;
9031 break;
9032 case 57345: // Darkmoon Card: Greatness
9033 {
9034 float stat = 0.0f;
9035 // strength
9036 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 60229; stat = GetStat(STAT_STRENGTH); }
9037 // agility
9038 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 60233; stat = GetStat(STAT_AGILITY); }
9039 // intellect
9040 if (GetStat(STAT_INTELLECT) > stat) { trigger_spell_id = 60234; stat = GetStat(STAT_INTELLECT);}
9041 // spirit
9042 if (GetStat(STAT_SPIRIT) > stat) { trigger_spell_id = 60235; }
9043 break;
9044 }
9045 case 67702: // Death's Choice, Item - Coliseum 25 Normal Melee Trinket
9046 {
9047 if (!damage)
9048 return false;
9049 float stat = 0.0f;
9050 // strength
9051 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67708; stat = GetStat(STAT_STRENGTH); }
9052 // agility
9053 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67703; }
9054 break;
9055 }
9056 case 67771: // Death's Choice (heroic), Item - Coliseum 25 Heroic Melee Trinket
9057 {
9058 if (!damage)
9059 return false;
9060 float stat = 0.0f;
9061 // strength
9062 if (GetStat(STAT_STRENGTH) > stat) { trigger_spell_id = 67773; stat = GetStat(STAT_STRENGTH); }
9063 // agility
9064 if (GetStat(STAT_AGILITY) > stat) { trigger_spell_id = 67772; }
9065 break;
9066 }
9067 case 27522: // Mana Drain Trigger
9068 case 40336: // Mana Drain Trigger
9069 case 46939: // Black Bow of the Betrayer
9070 {
9071 // On successful melee or ranged attack gain $29471s1 mana and if possible drain $27526s1 mana from the target.
9072 if (IsAlive())
9073 CastSpell(this, 29471, true, castItem, triggeredByAura);
9074 if (victim && victim->IsAlive())
9075 CastSpell(victim, 27526, true, castItem, triggeredByAura);
9076 return true;
9077 }
9078 // Forge of Souls, Devourer of Souls, Mirrored Soul
9079 case 69023:
9080 {
9081 int32 dmg = damage * 0.45f;
9082 if (dmg > 0)
9083 if (Aura* a = GetAura(69023))
9084 if (Unit* c = a->GetCaster())
9085 CastCustomSpell(c, 69034, &dmg, 0, 0, true);
9086 return true;
9087 }
9088 // Soul-Trader Beacon proc aura
9089 case 50051:
9090 {
9091 if (!victim)
9092 return false;
9093
9094 if (Creature* cr = GetCompanionPet())
9095 cr->CastSpell(victim, 50101, true);
9096
9097 return false;
9098 }
9099 }
9100 break;
9101 case SPELLFAMILY_MAGE:
9102 if (auraSpellInfo->SpellIconID == 2127) // Blazing Speed
9103 {
9104 switch (auraSpellInfo->Id)
9105 {
9106 case 31641: // Rank 1
9107 case 31642: // Rank 2
9108 trigger_spell_id = 31643;
9109 break;
9110 default:
9111 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Blazing Speed", auraSpellInfo->Id);
9112 return false;
9113 }
9114 }
9115 else if (auraSpellInfo->Id == 71761) // Deep Freeze Immunity State (only permanent)
9116 {
9117 Creature* creature = victim->ToCreature();
9118 if (!creature || !creature->HasMechanicTemplateImmunity(1 << (MECHANIC_STUN - 1)))
9119 return false;
9120 }
9121 break;
9123 {
9124 // Nether Protection
9125 if (auraSpellInfo->SpellIconID == 1985)
9126 {
9127 if (!procSpell)
9128 return false;
9129 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9130 {
9132 return false; // ignore
9133 case SPELL_SCHOOL_HOLY:
9134 trigger_spell_id = 54370;
9135 break;
9136 case SPELL_SCHOOL_FIRE:
9137 trigger_spell_id = 54371;
9138 break;
9140 trigger_spell_id = 54375;
9141 break;
9142 case SPELL_SCHOOL_FROST:
9143 trigger_spell_id = 54372;
9144 break;
9146 trigger_spell_id = 54374;
9147 break;
9149 trigger_spell_id = 54373;
9150 break;
9151 default:
9152 return false;
9153 }
9154 }
9155 break;
9156 }
9157 case SPELLFAMILY_PRIEST:
9158 {
9159 // Blessed Recovery
9160 if (auraSpellInfo->SpellIconID == 1875)
9161 {
9162 switch (auraSpellInfo->Id)
9163 {
9164 case 27811:
9165 trigger_spell_id = 27813;
9166 break;
9167 case 27815:
9168 trigger_spell_id = 27817;
9169 break;
9170 case 27816:
9171 trigger_spell_id = 27818;
9172 break;
9173 default:
9174 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in BR", auraSpellInfo->Id);
9175 return false;
9176 }
9177 basepoints0 = CalculatePct(int32(damage), triggerAmount) / 3;
9178 target = this;
9179 // Add remaining ticks to healing done
9180 CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_HEAL, basepoints0);
9181 return true;
9182 }
9183 break;
9184 }
9185 case SPELLFAMILY_DRUID:
9186 {
9187 switch (auraSpellInfo->Id)
9188 {
9189 // Druid Forms Trinket
9190 case 37336:
9191 {
9192 switch (GetShapeshiftForm())
9193 {
9194 case FORM_NONE:
9195 trigger_spell_id = 37344;
9196 break;
9197 case FORM_CAT:
9198 trigger_spell_id = 37341;
9199 break;
9200 case FORM_BEAR:
9201 case FORM_DIREBEAR:
9202 trigger_spell_id = 37340;
9203 break;
9204 case FORM_TREE:
9205 trigger_spell_id = 37342;
9206 break;
9207 case FORM_MOONKIN:
9208 trigger_spell_id = 37343;
9209 break;
9210 default:
9211 return false;
9212 }
9213 break;
9214 }
9215 // Druid T9 Feral Relic (Lacerate, Swipe, Mangle, and Shred)
9216 case 67353:
9217 {
9218 switch (GetShapeshiftForm())
9219 {
9220 case FORM_CAT:
9221 trigger_spell_id = 67355;
9222 break;
9223 case FORM_BEAR:
9224 case FORM_DIREBEAR:
9225 trigger_spell_id = 67354;
9226 break;
9227 default:
9228 return false;
9229 }
9230 break;
9231 }
9232 default:
9233 break;
9234 }
9235 break;
9236 }
9237 case SPELLFAMILY_HUNTER:
9238 {
9239 if (auraSpellInfo->SpellIconID == 3247) // Piercing Shots
9240 {
9241 if (!victim)
9242 return false;
9243
9244 switch (auraSpellInfo->Id)
9245 {
9246 case 53234: // Rank 1
9247 case 53237: // Rank 2
9248 case 53238: // Rank 3
9249 trigger_spell_id = 63468;
9250 break;
9251 default:
9252 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} miss posibly Piercing Shots", auraSpellInfo->Id);
9253 return false;
9254 }
9255 SpellInfo const* TriggerPS = sSpellMgr->GetSpellInfo(trigger_spell_id);
9256 if (!TriggerPS)
9257 return false;
9258
9259 basepoints0 = CalculatePct(int32(damage), triggerAmount) / (TriggerPS->GetMaxDuration() / TriggerPS->Effects[0].Amplitude);
9260 victim->CastDelayedSpellWithPeriodicAmount(this, trigger_spell_id, SPELL_AURA_PERIODIC_DAMAGE, basepoints0);
9261 return true;
9262 }
9263 // Item - Hunter T9 4P Bonus (Steady Shot)
9264 else if (auraSpellInfo->Id == 67151)
9265 {
9266 if (!IsPlayer() || !ToPlayer()->GetPet())
9267 return false;
9268
9269 target = ToPlayer()->GetPet();
9270 trigger_spell_id = 68130;
9271 break;
9272 }
9273 break;
9274 }
9276 {
9277 switch (auraSpellInfo->Id)
9278 {
9279 // Soul Preserver
9280 case 60510:
9281 {
9282 switch (getClass())
9283 {
9284 case CLASS_DRUID:
9285 trigger_spell_id = 60512;
9286 break;
9287 case CLASS_PALADIN:
9288 trigger_spell_id = 60513;
9289 break;
9290 case CLASS_PRIEST:
9291 trigger_spell_id = 60514;
9292 break;
9293 case CLASS_SHAMAN:
9294 trigger_spell_id = 60515;
9295 break;
9296 }
9297
9298 target = this;
9299 break;
9300 }
9301 case 37657: // Lightning Capacitor
9302 case 54841: // Thunder Capacitor
9303 case 67712: // Item - Coliseum 25 Normal Caster Trinket
9304 case 67758: // Item - Coliseum 25 Heroic Caster Trinket
9305 {
9306 if (!victim || !victim->IsAlive() || !IsPlayer())
9307 return false;
9308
9309 uint32 stack_spell_id = 0;
9310 switch (auraSpellInfo->Id)
9311 {
9312 case 37657:
9313 stack_spell_id = 37658;
9314 trigger_spell_id = 37661;
9315 break;
9316 case 54841:
9317 stack_spell_id = 54842;
9318 trigger_spell_id = 54843;
9319 break;
9320 case 67712:
9321 stack_spell_id = 67713;
9322 trigger_spell_id = 67714;
9323 break;
9324 case 67758:
9325 stack_spell_id = 67759;
9326 trigger_spell_id = 67760;
9327 break;
9328 }
9329
9330 if (cooldown && ToPlayer()->HasSpellCooldown(stack_spell_id))
9331 {
9332 return false;
9333 }
9334
9335 CastSpell(this, stack_spell_id, true, nullptr, triggeredByAura);
9336
9337 Aura* dummy = GetAura(stack_spell_id);
9338 if (!dummy || dummy->GetStackAmount() < triggerAmount)
9339 {
9340 return false;
9341 }
9342
9343 if (cooldown)
9344 {
9345 ToPlayer()->AddSpellCooldown(stack_spell_id, 0, cooldown);
9346 }
9347 RemoveAurasDueToSpell(stack_spell_id);
9348 CastSpell(victim, trigger_spell_id, true, nullptr, triggeredByAura);
9349 return true;
9350 }
9351 default:
9352 // Illumination
9353 if (auraSpellInfo->SpellIconID == 241)
9354 {
9355 if (!procSpell)
9356 return false;
9357 // procspell is triggered spell but we need mana cost of original casted spell
9358 uint32 originalSpellId = procSpell->Id;
9359 // Holy Shock heal
9360 if (procSpell->SpellFamilyFlags[1] & 0x00010000)
9361 {
9362 switch (procSpell->Id)
9363 {
9364 case 25914:
9365 originalSpellId = 20473;
9366 break;
9367 case 25913:
9368 originalSpellId = 20929;
9369 break;
9370 case 25903:
9371 originalSpellId = 20930;
9372 break;
9373 case 27175:
9374 originalSpellId = 27174;
9375 break;
9376 case 33074:
9377 originalSpellId = 33072;
9378 break;
9379 case 48820:
9380 originalSpellId = 48824;
9381 break;
9382 case 48821:
9383 originalSpellId = 48825;
9384 break;
9385 default:
9386 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} not handled in HShock", procSpell->Id);
9387 return false;
9388 }
9389 }
9390 SpellInfo const* originalSpell = sSpellMgr->GetSpellInfo(originalSpellId);
9391 if (!originalSpell)
9392 {
9393 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} unknown but selected as original in Illu", originalSpellId);
9394 return false;
9395 }
9396 // percent stored in effect 1 (class scripts) base points
9397 int32 cost = int32(originalSpell->ManaCost + CalculatePct(GetCreateMana(), originalSpell->ManaCostPercentage));
9398 basepoints0 = CalculatePct(cost, auraSpellInfo->Effects[1].CalcValue());
9399 trigger_spell_id = 20272;
9400 target = this;
9401 }
9402 break;
9403 }
9404 break;
9405 }
9406 case SPELLFAMILY_SHAMAN:
9407 {
9408 // Lightning Shield (overwrite non existing triggered spell call in spell.dbc
9409 if (auraSpellInfo->SpellFamilyFlags[0] & 0x400 && auraSpellInfo->HasAttribute(SPELL_ATTR1_NO_THREAT))
9410 {
9411 // Do not proc off from self-casted items
9412 if (Spell const* spell = eventInfo.GetProcSpell())
9413 {
9414 if (spell->m_castItemGUID && victim->GetGUID() == GetGUID())
9415 {
9416 return false;
9417 }
9418 }
9419
9420 trigger_spell_id = sSpellMgr->GetSpellWithRank(26364, auraSpellInfo->GetRank());
9421 }
9422 // Nature's Guardian
9423 else if (auraSpellInfo->SpellIconID == 2013)
9424 {
9425 // Check health condition - should drop to less 30% (damage deal after this!)
9426 if (!HealthBelowPctDamaged(30, damage))
9427 return false;
9428
9429 if (victim && victim->IsAlive())
9430 victim->GetThreatMgr().ModifyThreatByPercent(this, -10);
9431
9432 basepoints0 = int32(CountPctFromMaxHealth(triggerAmount));
9433 trigger_spell_id = 31616;
9434 target = this;
9435 }
9436 break;
9437 }
9439 {
9440 // Acclimation
9441 if (auraSpellInfo->SpellIconID == 1930)
9442 {
9443 if (!procSpell)
9444 return false;
9445 switch (GetFirstSchoolInMask(procSpell->GetSchoolMask()))
9446 {
9448 return false; // ignore
9449 case SPELL_SCHOOL_HOLY:
9450 trigger_spell_id = 50490;
9451 break;
9452 case SPELL_SCHOOL_FIRE:
9453 trigger_spell_id = 50362;
9454 break;
9456 trigger_spell_id = 50488;
9457 break;
9458 case SPELL_SCHOOL_FROST:
9459 trigger_spell_id = 50485;
9460 break;
9462 trigger_spell_id = 50489;
9463 break;
9465 trigger_spell_id = 50486;
9466 break;
9467 default:
9468 return false;
9469 }
9470 }
9471 // Blood Presence (Improved)
9472 else if (auraSpellInfo->Id == 63611)
9473 {
9474 if (!IsPlayer())
9475 return false;
9476
9477 trigger_spell_id = 50475;
9478 basepoints0 = CalculatePct(int32(damage), triggerAmount);
9479 }
9480 break;
9481 }
9482 }
9483 }
9484
9485 // All ok. Check current trigger spell
9486 SpellInfo const* triggerEntry = sSpellMgr->GetSpellInfo(trigger_spell_id);
9487 if (!triggerEntry)
9488 {
9489 // Don't cast unknown spell
9490 LOG_ERROR("entities.unit", "Unit::HandleProcTriggerSpell: Spell {} (effIndex: {}) has unknown TriggerSpell {}. Unhandled custom case?", auraSpellInfo->Id, triggeredByAura->GetEffIndex(), trigger_spell_id);
9491 return false;
9492 }
9493
9494 // not allow proc extra attack spell at extra attack
9495 if (triggerEntry->HasEffect(SPELL_EFFECT_ADD_EXTRA_ATTACKS))
9496 {
9497 uint32 lastExtraAttackSpell = eventInfo.GetActor()->GetLastExtraAttackSpell();
9498
9499 // Patch 1.12.0(?) extra attack abilities can no longer chain proc themselves
9500 if (lastExtraAttackSpell == trigger_spell_id)
9501 {
9502 return false;
9503 }
9504
9505 // Patch 2.2.0 Sword Specialization (Warrior, Rogue) extra attack can no longer proc additional extra attacks
9506 // 3.3.5 Sword Specialization (Warrior), Hack and Slash (Rogue)
9507 if (lastExtraAttackSpell == SPELL_SWORD_SPECIALIZATION || lastExtraAttackSpell == SPELL_HACK_AND_SLASH)
9508 {
9509 return false;
9510 }
9511 }
9512
9513 // Custom requirements (not listed in procEx) Warning! damage dealing after this
9514 // Custom triggered spells
9515 switch (auraSpellInfo->Id)
9516 {
9517 // Deep Wounds
9518 case 12834:
9519 case 12849:
9520 case 12867:
9521 {
9522 if (!IsPlayer())
9523 return false;
9524
9525 if (procFlags & PROC_FLAG_DONE_OFFHAND_ATTACK)
9527 else
9529 break;
9530 }
9531 // Persistent Shield (Scarab Brooch trinket)
9532 // This spell originally trigger 13567 - Dummy Trigger (vs dummy efect)
9533 case 26467:
9534 {
9535 basepoints0 = int32(CalculatePct(damage, 15));
9536 target = victim;
9537 trigger_spell_id = 26470;
9538 break;
9539 }
9540 // Unyielding Knights (item exploit 29108\29109)
9541 case 38164:
9542 {
9543 if (!victim || victim->GetEntry() != 19457) // Proc only if your target is Grillok
9544 return false;
9545 break;
9546 }
9547 // Deflection
9548 case 52420:
9549 {
9550 if (!HealthBelowPct(35))
9551 return false;
9552 break;
9553 }
9554
9555 // Cheat Death
9556 case 28845:
9557 {
9558 // When your health drops below 20%
9559 if (HealthBelowPctDamaged(20, damage) || HealthBelowPct(20))
9560 return false;
9561 break;
9562 }
9563 // Deadly Swiftness (Rank 1)
9564 case 31255:
9565 {
9566 // whenever you deal damage to a target who is below 20% health.
9567 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(20))
9568 return false;
9569
9570 target = this;
9571 trigger_spell_id = 22588;
9572 [[fallthrough]];
9573 }
9574 // Bonus Healing (Crystal Spire of Karabor mace)
9575 case 40971:
9576 {
9577 // If your target is below $s1% health
9578 if (!victim || !victim->IsAlive() || victim->HealthAbovePct(triggerAmount))
9579 return false;
9580 break;
9581 }
9582 // Rapid Recuperation
9583 case 53228:
9584 case 53232:
9585 {
9586 // This effect only from Rapid Fire (ability cast)
9587 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x20))
9588 return false;
9589 break;
9590 }
9591 // Decimation
9592 case 63156:
9593 case 63158:
9594 // Can proc only if target has hp below 35%
9595 if (!victim || !victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, procSpell, this))
9596 return false;
9597 break;
9598 // Ulduar, Hodir, Toasty Fire
9599 case 62821:
9600 if (!this->IsPlayer()) // spell has Attribute, but persistent area auras ignore it
9601 return false;
9602 break;
9603 case 15337: // Improved Spirit Tap (Rank 1)
9604 case 15338: // Improved Spirit Tap (Rank 2)
9605 {
9606 if (!procSpell)
9607 return false;
9608
9609 if (procSpell->SpellFamilyFlags[0] & 0x800000)
9610 if ((procSpell->Id != 58381) || !roll_chance_i(50))
9611 return false;
9612
9613 target = victim;
9614 break;
9615 }
9616 // Professor Putricide - Ooze Spell Tank Protection
9617 case 71770:
9618 if (victim)
9619 victim->CastSpell(victim, trigger_spell_id, true); // EffectImplicitTarget is self
9620 return true;
9621 case 45057: // Evasive Maneuvers (Commendation of Kael`thas trinket)
9622 case 71634: // Item - Icecrown 25 Normal Tank Trinket 1
9623 case 71640: // Item - Icecrown 25 Heroic Tank Trinket 1
9624 case 75475: // Item - Chamber of Aspects 25 Normal Tank Trinket
9625 case 75481: // Item - Chamber of Aspects 25 Heroic Tank Trinket
9626 {
9627 // Procs only if damage takes health below $s1%
9628 if (!HealthBelowPctDamaged(triggerAmount, damage))
9629 return false;
9630 break;
9631 }
9632 default:
9633 break;
9634 }
9635
9636 if (auraSpellInfo->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
9637 {
9638 // Xinef: keep this order, Aura 70656 has SpellIconID 85!
9639 // Item - Death Knight T10 Melee 4P Bonus
9640 if (auraSpellInfo->Id == 70656)
9641 {
9643 return false;
9644
9645 for (uint8 i = 0; i < MAX_RUNES; ++i)
9646 if (ToPlayer()->GetRuneCooldown(i) == 0)
9647 return false;
9648 }
9649 // Blade Barrier
9650 else if (auraSpellInfo->SpellIconID == 85)
9651 {
9652 Player* plr = ToPlayer();
9653 if (!plr || !plr->IsClass(CLASS_DEATH_KNIGHT, CLASS_CONTEXT_ABILITY) || !procSpell)
9654 return false;
9655
9657 return false;
9658 }
9659 // Rime
9660 else if (auraSpellInfo->SpellIconID == 56)
9661 {
9662 if (!IsPlayer())
9663 return false;
9664
9665 // Howling Blast
9667 }
9668 }
9669
9670 // Custom basepoints/target for exist spell
9671 // dummy basepoints or other customs
9672 switch (trigger_spell_id)
9673 {
9674 // Auras which should proc on area aura source (caster in this case):
9675 // Turn the Tables
9676 case 52914:
9677 case 52915:
9678 case 52910:
9679 // Honor Among Thieves
9680 case 51699:
9681 {
9682 target = triggeredByAura->GetBase()->GetCaster();
9683 if (!target)
9684 return false;
9685
9686 if (Player* pTarget = target->ToPlayer())
9687 {
9688 if (cooldown)
9689 {
9690 if (pTarget->HasSpellCooldown(trigger_spell_id))
9691 return false;
9692 pTarget->AddSpellCooldown(trigger_spell_id, 0, cooldown);
9693 }
9694
9695 Unit* cptarget = nullptr;
9696 if (trigger_spell_id == 51699)
9697 {
9698 cptarget = pTarget->GetComboTarget();
9699 if (!cptarget)
9700 {
9701 cptarget = pTarget->GetSelectedUnit();
9702 }
9703 }
9704 else
9705 cptarget = target;
9706
9707 if (cptarget)
9708 {
9709 target->CastSpell(cptarget, trigger_spell_id, true);
9710 return true;
9711 }
9712 }
9713 return false;
9714 }
9715 // Cast positive spell on enemy target
9716 case 20233: // Improved Lay on Hands (cast on target)
9717 {
9718 target = victim;
9719 break;
9720 }
9721 // Ruby Drake, Evasive Aura
9722 case 50241:
9723 {
9724 if (GetAura(50240))
9725 return false;
9726
9727 break;
9728 }
9729 // Combo points add triggers (need add combopoint only for main target, and after possible combopoints reset)
9730 case 15250: // Rogue Setup
9731 {
9732 // applied only for main target
9733 if (!victim || (IsPlayer() && victim != ToPlayer()->GetSelectedUnit()))
9734 return false;
9735 break; // continue normal case
9736 }
9737 // Finish movies that add combo
9738 case 14189: // Seal Fate (Netherblade set)
9739 case 14157: // Ruthlessness
9740 {
9741 victim = nullptr;
9742 // Need add combopoint AFTER finish movie (or they dropped in finish phase)
9743 break;
9744 }
9745 // Item - Druid T10 Balance 2P Bonus
9746 case 16870:
9747 {
9748 if (HasAura(70718))
9749 CastSpell(this, 70721, true);
9750 RemoveAurasDueToSpell(trigger_spell_id);
9751 break;
9752 }
9753 // Shamanistic Rage triggered spell
9754 case 30824:
9755 {
9756 basepoints0 = int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), triggerAmount));
9757 break;
9758 }
9759 // Enlightenment (trigger only from mana cost spells)
9760 case 35095:
9761 {
9762 if (!procSpell || procSpell->PowerType != POWER_MANA || (procSpell->ManaCost == 0 && procSpell->ManaCostPercentage == 0 && procSpell->ManaCostPerlevel == 0))
9763 return false;
9764 break;
9765 }
9766 case 46916: // Slam! (Bloodsurge proc)
9767 case 52437: // Sudden Death
9768 {
9769 // Item - Warrior T10 Melee 4P Bonus
9770 if (AuraEffect const* aurEff = GetAuraEffect(70847, 0))
9771 {
9772 if (!roll_chance_i(aurEff->GetAmount()))
9773 {
9774 // Xinef: dont allow normal proc to override set one
9775 if (GetAura((trigger_spell_id == 46916) ? 71072 : 71069))
9776 return false;
9777 // Xinef: just to be sure
9778 RemoveAurasDueToSpell(70849);
9779 break;
9780 }
9781
9782 // Xinef: fully remove all auras and reapply once more
9783 RemoveAurasDueToSpell(70849);
9784 RemoveAurasDueToSpell(71072);
9785 RemoveAurasDueToSpell(71069);
9786
9787 CastSpell(this, 70849, true, castItem, triggeredByAura); // Extra Charge!
9788 if (trigger_spell_id == 46916)
9789 CastSpell(this, 71072, true, castItem, triggeredByAura); // Slam GCD Reduced
9790 else
9791 CastSpell(this, 71069, true, castItem, triggeredByAura); // Execute GCD Reduced
9792 }
9793 break;
9794 }
9795 // Sword and Board
9796 case 50227:
9797 {
9798 // Remove cooldown on Shield Slam
9799 if (IsPlayer())
9801 break;
9802 }
9803 // Maelstrom Weapon
9804 case 53817:
9805 {
9806 // have rank dependent proc chance, ignore too often cases
9807 // PPM = 2.5 * (rank of talent),
9808 uint32 rank = auraSpellInfo->GetRank();
9809 // 5 rank -> 100% 4 rank -> 80% and etc from full rate
9810 if (!roll_chance_i(20 * rank))
9811 return false;
9812
9813 // Item - Shaman T10 Enhancement 4P Bonus
9814 if (AuraEffect const* aurEff = GetAuraEffect(70832, 0))
9815 if (Aura const* maelstrom = GetAura(53817))
9816 // xinef: we have 4 charges and all proc conditions are met - aura reaches 5 charges
9817 if ((maelstrom->GetStackAmount() == 4) && roll_chance_i(aurEff->GetAmount()))
9818 CastSpell(this, 70831, true, castItem, triggeredByAura);
9819
9820 break;
9821 }
9822 // Astral Shift
9823 case 52179:
9824 {
9825 if (!procSpell || !(procEx & (PROC_EX_NORMAL_HIT | PROC_EX_CRITICAL_HIT)) || this == victim)
9826 return false;
9827
9828 // Need stun, fear or silence mechanic
9829 if (!(procSpell->GetAllEffectsMechanicMask() & ((1 << MECHANIC_SILENCE) | (1 << MECHANIC_STUN) | (1 << MECHANIC_FEAR))))
9830 return false;
9831 break;
9832 }
9833 // Glyph of Death's Embrace
9834 case 58679:
9835 {
9836 // Proc only from healing part of Death Coil. Check is essential as all Death Coil spells have 0x2000 mask in SpellFamilyFlags
9837 if (!procSpell || !(procSpell->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT && procSpell->SpellFamilyFlags[0] == 0x80002000))
9838 return false;
9839 break;
9840 }
9841 // Glyph of Death Grip
9842 case 58628:
9843 {
9844 // remove cooldown of Death Grip
9845 if (IsPlayer())
9846 ToPlayer()->RemoveSpellCooldown(49576, true);
9847 return true;
9848 }
9849 // Savage Defense
9850 case 62606:
9851 {
9852 basepoints0 = CalculatePct(triggerAmount, GetTotalAttackPowerValue(BASE_ATTACK));
9853 break;
9854 }
9855 // Body and Soul
9856 case 64128:
9857 case 65081:
9858 {
9859 // Proc only from PW:S cast
9860 if (!procSpell || !(procSpell->SpellFamilyFlags[0] & 0x00000001))
9861 return false;
9862 break;
9863 }
9864 // Culling the Herd
9865 case 70893:
9866 {
9867 if (!procSpell)
9868 {
9869 return false;
9870 }
9871 // check if we're doing a critical hit
9872 if (!(procSpell->SpellFamilyFlags[1] & 0x10000000) && (procEx != PROC_EX_CRITICAL_HIT))
9873 return false;
9874 // check if we're procced by Claw, Bite or Smack (need to use the spell icon ID to detect it)
9875 if (!(procSpell->SpellIconID == 262 || procSpell->SpellIconID == 1680 || procSpell->SpellIconID == 473))
9876 return false;
9877 break;
9878 }
9879 // Fingers of Frost, synchronise with Frostbite
9880 case 44544:
9881 {
9882 if (procPhase == PROC_SPELL_PHASE_HIT)
9883 {
9884 // Find Frostbite
9886 {
9887 if (!victim)
9888 return false;
9889
9890 uint8 fofRank = sSpellMgr->GetSpellRank(triggeredByAura->GetId());
9891 uint8 fbRank = sSpellMgr->GetSpellRank(aurEff->GetId());
9892 uint8 chance = uint8(std::ceil(fofRank * fbRank * 16.6f));
9893
9894 if (roll_chance_i(chance))
9895 CastSpell(victim, aurEff->GetSpellInfo()->Effects[EFFECT_0].TriggerSpell, true);
9896 }
9897 }
9898 break;
9899 }
9900 }
9901
9902 // try detect target manually if not set
9903 if (!target)
9904 target = !(procFlags & (PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS | PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS)) && triggerEntry->IsPositive() ? this : victim;
9905
9906 if (cooldown)
9907 {
9908 if (HasSpellCooldown(triggerEntry->Id))
9909 return false;
9910
9911 AddSpellCooldown(triggerEntry->Id, 0, cooldown);
9912 }
9913
9914 if (basepoints0)
9915 CastCustomSpell(target, triggerEntry->Id, &basepoints0, nullptr, nullptr, true, castItem, triggeredByAura);
9916 else
9917 CastSpell(target, triggerEntry->Id, true, castItem, triggeredByAura);
9918
9919 return true;
9920}
@ SPELL_EFFECT_ADD_EXTRA_ATTACKS
Definition SharedDefines.h:797
@ SPELL_ATTR1_NO_THREAT
Definition SharedDefines.h:429
@ MECHANIC_FEAR
Definition SharedDefines.h:1330
@ MECHANIC_SILENCE
Definition SharedDefines.h:1334
@ AURA_STATE_HEALTHLESS_35_PERCENT
Definition SharedDefines.h:1305
@ SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE
Definition SpellAuraDefines.h:294
@ SPELL_AURA_ADD_TARGET_TRIGGER
Definition SpellAuraDefines.h:172
@ PROC_SPELL_PHASE_HIT
Definition SpellMgr.h:244
@ FORM_DIREBEAR
Definition UnitDefines.h:77
@ FORM_MOONKIN
Definition UnitDefines.h:98
@ FORM_NONE
Definition UnitDefines.h:69
@ FORM_CAT
Definition UnitDefines.h:70
@ FORM_TREE
Definition UnitDefines.h:71
@ FORM_BEAR
Definition UnitDefines.h:74
@ SPELL_HACK_AND_SLASH
Definition Unit.h:293
@ SPELL_SWORD_SPECIALIZATION
Definition Unit.h:292
bool HasMechanicTemplateImmunity(uint32 mask) const
Definition Creature.cpp:2218
bool IsBaseRuneSlotsOnCooldown(RuneType runeType) const
Definition Player.cpp:13454
void RemoveCategoryCooldown(uint32 cat)
Definition Player.cpp:3551
bool IsClass(Classes playerClass, ClassContext context=CLASS_CONTEXT_NONE) const override
Definition Player.cpp:1290
Spell const * GetProcSpell() const
Definition Unit.h:449
Unit * GetActor()
Definition Unit.h:440
uint8 GetRank() const
Definition SpellInfo.cpp:2506
uint32 ManaCostPercentage
Definition SpellInfo.h:367
bool HasEffect(SpellEffects effect) const
Definition SpellInfo.cpp:876
uint32 ManaCost
Definition SpellInfo.h:363
void ModifyThreatByPercent(Unit *victim, int32 percent)
Definition ThreatMgr.cpp:508
bool HealthAbovePct(int32 pct) const
Definition Unit.h:1041
Creature * GetCompanionPet() const
Definition Unit.cpp:10752
float GetTotalAttackPowerValue(WeaponAttackType attType, Unit *pVictim=nullptr) const
Definition Unit.cpp:15518
uint32 GetLastExtraAttackSpell() const
Definition Unit.h:949
uint32 GetCreateHealth() const
Definition Unit.h:1035
Unit * GetComboTarget() const
Definition Unit.h:955
bool HealthBelowPctDamaged(int32 pct, uint32 damage) const
Definition Unit.h:1040

References Player::AddSpellCooldown(), AddSpellCooldown(), AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, CalculatePct(), CastCustomSpell(), CastDelayedSpellWithPeriodicAmount(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_DEATH_KNIGHT, CLASS_DRUID, CLASS_PALADIN, CLASS_PRIEST, CLASS_SHAMAN, CountPctFromMaxHealth(), EFFECT_0, SpellInfo::Effects, FORM_BEAR, FORM_CAT, FORM_DIREBEAR, FORM_MOONKIN, FORM_NONE, FORM_TREE, ProcEventInfo::GetActor(), SpellInfo::GetAllEffectsMechanicMask(), AuraEffect::GetAmount(), GetAura(), GetAuraEffect(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), Aura::GetCaster(), Aura::GetCastItemGUID(), getClass(), GetComboTarget(), GetCompanionPet(), GetCreateHealth(), GetCreateMana(), AuraEffect::GetEffIndex(), Object::GetEntry(), GetFirstSchoolInMask(), Object::GetFloatValue(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), Player::GetItemByGuid(), GetLastExtraAttackSpell(), SpellInfo::GetMaxDuration(), Player::GetPet(), ProcEventInfo::GetProcSpell(), SpellInfo::GetRank(), SpellInfo::GetSchoolMask(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), Aura::GetStackAmount(), GetStat(), GetThreatMgr(), GetTotalAttackPowerValue(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), SpellInfo::HasEffect(), Creature::HasMechanicTemplateImmunity(), HasSpellCooldown(), HealthAbovePct(), HealthBelowPct(), HealthBelowPctDamaged(), SpellInfo::Id, IsAlive(), Player::IsBaseRuneSlotsOnCooldown(), Player::IsClass(), IsClass(), Object::IsPlayer(), SpellInfo::IsPositive(), LOG_ERROR, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, SpellInfo::ManaCostPerlevel, MAX_RUNES, MECHANIC_FEAR, MECHANIC_SILENCE, MECHANIC_STUN, ThreatMgr::ModifyThreatByPercent(), POWER_MANA, SpellInfo::PowerType, PROC_EX_CRITICAL_HIT, PROC_EX_NORMAL_HIT, PROC_FLAG_DONE_OFFHAND_ATTACK, PROC_FLAG_DONE_SPELL_MAGIC_DMG_CLASS_POS, PROC_FLAG_DONE_SPELL_NONE_DMG_CLASS_POS, PROC_SPELL_PHASE_HIT, RemoveAurasDueToSpell(), Player::RemoveCategoryCooldown(), Player::RemoveSpellCooldown(), roll_chance_i(), RUNE_BLOOD, SPELL_ATTR1_NO_THREAT, SPELL_AURA_ADD_TARGET_TRIGGER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_EFFECT_ADD_EXTRA_ATTACKS, SPELL_HACK_AND_SLASH, SPELL_SCHOOL_ARCANE, SPELL_SCHOOL_FIRE, SPELL_SCHOOL_FROST, SPELL_SCHOOL_HOLY, SPELL_SCHOOL_NATURE, SPELL_SCHOOL_NORMAL, SPELL_SCHOOL_SHADOW, SPELL_SWORD_SPECIALIZATION, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sSpellMgr, STAT_AGILITY, STAT_INTELLECT, STAT_SPIRIT, STAT_STRENGTH, Object::ToCreature(), Object::ToPlayer(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MINDAMAGE, and UNIT_FIELD_MINOFFHANDDAMAGE.

Referenced by ProcDamageAndSpellFor().

◆ HandleSafeUnitPointersOnDelete()

void Unit::HandleSafeUnitPointersOnDelete ( Unit thisUnit)
static
4386{
4387 if (thisUnit->SafeUnitPointerSet.empty())
4388 return;
4389 for (std::set<SafeUnitPointer*>::iterator itr = thisUnit->SafeUnitPointerSet.begin(); itr != thisUnit->SafeUnitPointerSet.end(); ++itr)
4390 (*itr)->UnitDeleted();
4391
4392 thisUnit->SafeUnitPointerSet.clear();
4393}

References SafeUnitPointerSet.

Referenced by ~Unit().

◆ HandleSpellClick()

bool Unit::HandleSpellClick ( Unit clicker,
int8  seatId = -1 
)

First check simple relations from clicker to clickee

Check database conditions

19374{
19375 Creature* creature = ToCreature();
19376 if (creature && creature->IsAIEnabled)
19377 {
19378 if (!creature->AI()->BeforeSpellClick(clicker))
19379 {
19380 return false;
19381 }
19382 }
19383
19384 bool result = false;
19385 uint32 spellClickEntry = GetVehicleKit() ? GetVehicleKit()->GetCreatureEntry() : GetEntry();
19386 SpellClickInfoMapBounds clickPair = sObjectMgr->GetSpellClickInfoMapBounds(spellClickEntry);
19387 for (SpellClickInfoContainer::const_iterator itr = clickPair.first; itr != clickPair.second; ++itr)
19388 {
19390 if (!itr->second.IsFitToRequirements(clicker, this))
19391 continue;
19392
19394 ConditionList conds = sConditionMgr->GetConditionsForSpellClickEvent(spellClickEntry, itr->second.spellId);
19395 ConditionSourceInfo info = ConditionSourceInfo(clicker, this);
19396 if (!sConditionMgr->IsObjectMeetToConditions(info, conds))
19397 continue;
19398
19399 Unit* caster = (itr->second.castFlags & NPC_CLICK_CAST_CASTER_CLICKER) ? clicker : this;
19400 Unit* target = (itr->second.castFlags & NPC_CLICK_CAST_TARGET_CLICKER) ? clicker : this;
19401 ObjectGuid origCasterGUID = (itr->second.castFlags & NPC_CLICK_CAST_ORIG_CASTER_OWNER) ? GetOwnerGUID() : clicker->GetGUID();
19402
19403 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(itr->second.spellId);
19404
19405 // xinef: dont allow players to enter vehicles on arena
19406 if (spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) && caster->IsPlayer() && caster->FindMap() && caster->FindMap()->IsBattleArena())
19407 continue;
19408
19409 if (seatId > -1)
19410 {
19411 uint8 i = 0;
19412 bool valid = false;
19413 while (i < MAX_SPELL_EFFECTS)
19414 {
19415 if (spellInfo->Effects[i].ApplyAuraName == SPELL_AURA_CONTROL_VEHICLE)
19416 {
19417 valid = true;
19418 break;
19419 }
19420 ++i;
19421 }
19422
19423 if (!valid)
19424 {
19425 LOG_ERROR("sql.sql", "Spell {} specified in npc_spellclick_spells is not a valid vehicle enter aura!", itr->second.spellId);
19426 continue;
19427 }
19428
19429 if (IsInMap(caster))
19430 caster->CastCustomSpell(itr->second.spellId, SpellValueMod(SPELLVALUE_BASE_POINT0 + i), seatId + 1, target, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19431 else // This can happen during Player::_LoadAuras
19432 {
19434 for (uint32 j = 0; j < MAX_SPELL_EFFECTS; ++j)
19435 bp0[j] = spellInfo->Effects[j].BasePoints;
19436
19437 bp0[i] = seatId;
19438 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, bp0, nullptr, origCasterGUID);
19439 }
19440 }
19441 else
19442 {
19443 if (IsInMap(caster))
19444 caster->CastSpell(target, spellInfo, GetVehicleKit() ? TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE : TRIGGERED_NONE, nullptr, nullptr, origCasterGUID);
19445 else
19446 Aura::TryRefreshStackOrCreate(spellInfo, MAX_EFFECT_MASK, this, clicker, nullptr, nullptr, origCasterGUID);
19447 }
19448
19449 result = true;
19450 }
19451
19452 if (creature && creature->IsAIEnabled)
19453 creature->AI()->OnSpellClick(clicker, result);
19454
19455 return result;
19456}
#define sConditionMgr
Definition ConditionMgr.h:290
std::list< Condition * > ConditionList
Definition ConditionMgr.h:237
std::pair< SpellClickInfoContainer::const_iterator, SpellClickInfoContainer::const_iterator > SpellClickInfoMapBounds
Definition ObjectMgr.h:408
@ NPC_CLICK_CAST_TARGET_CLICKER
Definition SharedDefines.h:691
@ NPC_CLICK_CAST_ORIG_CASTER_OWNER
Definition SharedDefines.h:692
@ NPC_CLICK_CAST_CASTER_CLICKER
Definition SharedDefines.h:690
SpellValueMod
Definition SpellDefines.h:112
virtual void OnSpellClick(Unit *, bool &)
Definition CreatureAI.h:203
virtual bool BeforeSpellClick(Unit *)
Definition CreatureAI.h:201
bool IsBattleArena() const
Definition Map.h:297
bool HasAura(AuraType aura) const
Definition SpellInfo.cpp:893
uint32 GetCreatureEntry() const
Definition Vehicle.h:39
Map * FindMap() const
Definition Object.h:588
Definition ConditionMgr.h:182

References Creature::AI(), CreatureAI::BeforeSpellClick(), CastCustomSpell(), CastSpell(), SpellInfo::Effects, WorldObject::FindMap(), Vehicle::GetCreatureEntry(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), GetVehicleKit(), SpellInfo::HasAura(), IsAIEnabled, Map::IsBattleArena(), WorldObject::IsInMap(), Object::IsPlayer(), LOG_ERROR, MAX_EFFECT_MASK, MAX_SPELL_EFFECTS, NPC_CLICK_CAST_CASTER_CLICKER, NPC_CLICK_CAST_ORIG_CASTER_OWNER, NPC_CLICK_CAST_TARGET_CLICKER, CreatureAI::OnSpellClick(), sConditionMgr, sObjectMgr, SPELL_AURA_CONTROL_VEHICLE, SPELLVALUE_BASE_POINT0, sSpellMgr, Object::ToCreature(), TRIGGERED_IGNORE_CASTER_MOUNTED_OR_ON_VEHICLE, TRIGGERED_NONE, and Aura::TryRefreshStackOrCreate().

Referenced by boss_xt002::boss_xt002AI::AttachHeart(), boss_kologarn::boss_kologarnAI::AttachLeftArm(), boss_kologarn::boss_kologarnAI::AttachRightArm(), WorldSession::HandleSpellClick(), Vehicle::InstallAccessory(), and npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI().

◆ HandleStatModifier()

bool Unit::HandleStatModifier ( UnitMods  unitMod,
UnitModifierType  modifierType,
float  amount,
bool  apply 
)
15294{
15295 if (unitMod >= UNIT_MOD_END || modifierType >= MODIFIER_TYPE_END)
15296 {
15297 LOG_ERROR("entities.unit", "ERROR in HandleStatModifier(): non-existing UnitMods or wrong UnitModifierType!");
15298 return false;
15299 }
15300
15301 switch (modifierType)
15302 {
15303 case BASE_VALUE:
15304 case TOTAL_VALUE:
15305 m_auraModifiersGroup[unitMod][modifierType] += apply ? amount : -amount;
15306 break;
15307 case BASE_PCT:
15308 case TOTAL_PCT:
15309 ApplyPercentModFloatVar(m_auraModifiersGroup[unitMod][modifierType], amount, apply);
15310 break;
15311 default:
15312 break;
15313 }
15314
15315 if (!CanModifyStats())
15316 return false;
15317
15318 switch (unitMod)
15319 {
15326 break;
15327
15328 case UNIT_MOD_ARMOR:
15329 UpdateArmor();
15330 break;
15331 case UNIT_MOD_HEALTH:
15333 break;
15334
15335 case UNIT_MOD_MANA:
15336 case UNIT_MOD_RAGE:
15337 case UNIT_MOD_FOCUS:
15338 case UNIT_MOD_ENERGY:
15339 case UNIT_MOD_HAPPINESS:
15340 case UNIT_MOD_RUNE:
15343 break;
15344
15352 break;
15353
15356 break;
15359 break;
15360
15363 break;
15366 break;
15369 break;
15370
15371 default:
15372 break;
15373 }
15374
15375 return true;
15376}
@ UNIT_MOD_ARMOR
Definition Unit.h:157
@ UNIT_MOD_ATTACK_POWER
Definition Unit.h:164
@ UNIT_MOD_HEALTH
Definition Unit.h:149
@ UNIT_MOD_DAMAGE_RANGED
Definition Unit.h:168
@ UNIT_MOD_DAMAGE_MAINHAND
Definition Unit.h:166
@ UNIT_MOD_ATTACK_POWER_RANGED
Definition Unit.h:165
SpellSchools GetSpellSchoolByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15435
Stats GetStatByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15467
virtual void UpdateAttackPowerAndDamage(bool ranged=false)=0
virtual void UpdateResistances(uint32 school)=0
Powers GetPowerTypeByAuraGroup(UnitMods unitMod) const
Definition Unit.cpp:15496
virtual void UpdateDamagePhysical(WeaponAttackType attType)
Definition StatSystem.cpp:60
virtual void UpdateArmor()=0
virtual void UpdateMaxPower(Powers power)=0
virtual bool UpdateStats(Stats stat)=0
bool CanModifyStats() const
Definition Unit.h:1020
virtual void UpdateMaxHealth()=0

References ApplyPercentModFloatVar(), BASE_ATTACK, BASE_PCT, BASE_VALUE, CanModifyStats(), GetPowerTypeByAuraGroup(), GetSpellSchoolByAuraGroup(), GetStatByAuraGroup(), LOG_ERROR, m_auraModifiersGroup, MODIFIER_TYPE_END, OFF_ATTACK, RANGED_ATTACK, TOTAL_PCT, TOTAL_VALUE, UNIT_MOD_ARMOR, UNIT_MOD_ATTACK_POWER, UNIT_MOD_ATTACK_POWER_RANGED, UNIT_MOD_DAMAGE_MAINHAND, UNIT_MOD_DAMAGE_OFFHAND, UNIT_MOD_DAMAGE_RANGED, UNIT_MOD_END, UNIT_MOD_ENERGY, UNIT_MOD_FOCUS, UNIT_MOD_HAPPINESS, UNIT_MOD_HEALTH, UNIT_MOD_MANA, UNIT_MOD_RAGE, UNIT_MOD_RESISTANCE_ARCANE, UNIT_MOD_RESISTANCE_FIRE, UNIT_MOD_RESISTANCE_FROST, UNIT_MOD_RESISTANCE_HOLY, UNIT_MOD_RESISTANCE_NATURE, UNIT_MOD_RESISTANCE_SHADOW, UNIT_MOD_RUNE, UNIT_MOD_RUNIC_POWER, UNIT_MOD_STAT_AGILITY, UNIT_MOD_STAT_INTELLECT, UNIT_MOD_STAT_SPIRIT, UNIT_MOD_STAT_STAMINA, UNIT_MOD_STAT_STRENGTH, UpdateArmor(), UpdateAttackPowerAndDamage(), UpdateDamagePhysical(), UpdateMaxHealth(), UpdateMaxPower(), UpdateResistances(), and UpdateStats().

Referenced by Player::_ApplyItemBonuses(), Player::_ApplyWeaponDependentAuraDamageMod(), boss_marli::_schedulePhaseSpider(), boss_marli::_schedulePhaseTroll(), Player::ApplyEnchantment(), AuraEffect::HandleAuraIncreaseBaseHealthPercent(), AuraEffect::HandleAuraModAttackPower(), AuraEffect::HandleAuraModAttackPowerPercent(), AuraEffect::HandleAuraModBaseResistancePCT(), AuraEffect::HandleAuraModIncreaseEnergy(), AuraEffect::HandleAuraModIncreaseEnergyPercent(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), AuraEffect::HandleAuraModRangedAttackPower(), AuraEffect::HandleAuraModRangedAttackPowerPercent(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModResistanceExclusive(), AuraEffect::HandleAuraModStat(), AuraEffect::HandleModBaseResistance(), AuraEffect::HandleModDamageDone(), AuraEffect::HandleModDamagePercentDone(), AuraEffect::HandleModOffhandDamagePercent(), AuraEffect::HandleModPercentStat(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), Guardian::InitStatsForLevel(), spell_astromancer_solarian_transform::OnApply(), spell_astromancer_solarian_transform::OnRemove(), boss_arlokk::boss_arlokkAI::Reset(), boss_marli::Reset(), and boss_arlokk::boss_arlokkAI::UpdateAI().

◆ HasActivePowerType()

◆ HasAllAuras()

template<typename... Auras>
bool Unit::HasAllAuras ( Auras...  spellIds) const
inline

Checks if the unit has ALL specified auras.

Template Parameters
AurasCan be any type convertible to uint32.
Parameters
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the unit has ALL of the specified auras. Otherwise false.
1411 {
1412 std::vector<uint32> spellList = { static_cast<uint32>(spellIds)... };
1413 return HasAuras(SearchMethod::MatchAll, spellList);
1414 }
bool HasAuras(SearchMethod sm, std::vector< uint32 > &spellIds) const
Check if unit has ANY or ALL specified auras.
Definition Unit.cpp:5754

References HasAuras(), and MatchAll.

Referenced by achievement_staying_buffed_all_winter_10::OnCheck(), achievement_staying_buffed_all_winter_25::OnCheck(), npc_alchemist_adrianna::OnGossipHello(), and npc_nelson::npc_nelsonAI::SpellHit().

◆ HasAllowOnlyAbilityAura()

bool Unit::HasAllowOnlyAbilityAura ( ) const
inline
@ SPELL_AURA_ALLOW_ONLY_ABILITY
Definition SpellAuraDefines.h:326
bool HasAuraType(AuraType auraType) const
Definition Unit.cpp:5784

References HasAuraType(), and SPELL_AURA_ALLOW_ONLY_ABILITY.

Referenced by AuraEffect::HandleAuraAllowOnlyAbility().

◆ HasAnyAuras()

template<typename... Auras>
bool Unit::HasAnyAuras ( Auras...  spellIds) const
inline

◆ HasAOECharmAura()

bool Unit::HasAOECharmAura ( ) const
inline
@ SPELL_AURA_AOE_CHARM
Definition SpellAuraDefines.h:240

References HasAuraType(), and SPELL_AURA_AOE_CHARM.

◆ HasAttackerSpellCritChanceAura()

bool Unit::HasAttackerSpellCritChanceAura ( ) const
inline
@ SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:242

References HasAuraType(), and SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE.

Referenced by SpellTakenCritChance().

◆ HasAura()

bool Unit::HasAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
ObjectGuid  itemCasterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0 
) const
5778{
5779 if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask))
5780 return true;
5781 return false;
5782}

References GetAuraApplication().

Referenced by boss_grand_champion::boss_grand_championAI::AddCreatureAddonAuras(), Pet::AddToWorld(), spell_warl_health_funnel::ApplyEffect(), boss_archavon::boss_archavonAI::AttackStart(), boss_emalon::boss_emalonAI::AttackStart(), boss_koralon::boss_koralonAI::AttackStart(), boss_toravon::boss_toravonAI::AttackStart(), boss_leotheras_the_blind::AttackStart(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), boss_hodir::boss_hodirAI::CanAIAttack(), boss_hazzarah::CanAIAttack(), boss_renataki::boss_renatakiAI::CanAIAttack(), boss_chromaggus::boss_chromaggusAI::CanAIAttack(), npc_parasitic_shadowfiend::CanAIAttack(), npc_wg_siege_machine::npc_wg_siege_machineAI::CanControlVehicle(), Player::CanJoinToBattleground(), Player::CanResummonPet(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CastItemCombatSpell(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), Spell::CheckCast(), Spell::CheckCasterAuras(), Spell::CheckItems(), spell_pal_hand_of_sacrifice::CheckTarget(), SpellInfo::CheckTarget(), spell_hun_lock_and_load::CheckTrapProc(), npc_jenny::DamageTaken(), npc_mc_core_hound::npc_mc_core_houndAI::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), boss_razorscale::boss_razorscaleAI::DamageTaken(), boss_thekal::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), boss_kalecgos::DoAction(), boss_illidan_stormrage::DoAction(), npc_midsummer_ribbon_pole_target::DoCleanupChecks(), Spell::DoCreateItem(), Spell::EffectDummy(), Spell::EffectHeal(), Spell::EffectInstaKill(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSummonPlayer(), Spell::EffectTriggerSpell(), Spell::EffectWeaponDmg(), NPCStaveQuestAI::EvadeOnFeignDeath(), IceTombSummonEvent::Execute(), PartyTimeEmoteEvent::Execute(), spell_class_call_polymorph::FilterTargets(), spell_dru_wild_growth::FilterTargets(), spell_pri_circle_of_healing::FilterTargets(), Spell::finish(), lfg::LFGMgr::FinishDungeon(), GetDispellableAuraList(), Player::GetResurrectionSpellId(), go_wind_stone::go_wind_stoneAI::GossipHello(), go_soulwell::go_soulwellAI::GossipHello(), spell_braziers_hit::HandleAfterEffectApply(), spell_dk_scourge_strike::HandleAfterHit(), spell_dru_enrage::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraMounted(), Aura::HandleAuraSpecificMods(), WorldSession::HandleBattleFieldPortOpcode(), spell_thaddius_pos_neg_charge::HandleDamage(), spell_capacitus_polarity_charge::HandleDamage(), spell_mage_summon_water_elemental::HandleDummy(), spell_rog_preparation::HandleDummy(), spell_warr_charge::HandleDummy(), HandleDummyAuraProc(), spell_q12851_going_bearback::HandleEffectApply(), spell_dk_improved_blood_presence::HandleEffectApply(), spell_dk_improved_frost_presence::HandleEffectApply(), spell_dk_improved_unholy_presence::HandleEffectApply(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), Player::HandleFall(), gm_commandscript::HandleGMVisibleCommand(), spell_dk_presence::HandleImprovedBloodPresence(), spell_dk_presence::HandleImprovedFrostPresence(), spell_dk_presence::HandleImprovedUnholyPresence(), spell_sindragosa_frost_breath::HandleInfusion(), BattlefieldWG::HandleKill(), lookup_commandscript::HandleLookupSpellCommand(), lookup_commandscript::HandleLookupSpellIdCommand(), WorldSession::HandleMessagechatOpcode(), spell_oculus_soar_aura::HandleOnEffectApply(), spell_mark_of_frost_freeze::HandleOnHit(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_garr_separation_anxiety_aura::HandlePeriodic(), spell_majordomo_separation_anxiety_aura::HandlePeriodic(), spell_dk_blood_caked_blade::HandleProc(), HandleProcTriggerSpell(), spell_warr_vigilance::HandleRemove(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_pal_lay_on_hands::HandleScript(), spell_hun_pet_heart_of_the_phoenix::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_q12611_deathbolt::HandleScriptEffect(), spell_dru_glyph_of_starfire::HandleScriptEffect(), misc_commandscript::HandleUnFreezeCommand(), HasAuras(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::InformCloud(), boss_taldaram::InitializeAI(), Player::IsDeserter(), SpellArea::IsFitToRequirements(), npc_anzu_spirit::IsSummonedBy(), go_wg_vehicle_teleporter::go_wg_vehicle_teleporterAI::IsValidVehicle(), lfg::LFGMgr::JoinLfg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustDied(), boss_professor_putricide::boss_professor_putricideAI::JustDied(), boss_sindragosa::boss_sindragosaAI::JustDied(), boss_hydross_the_unstable::JustDied(), boss_alar::JustDied(), npc_sunblade_scout::JustEngagedWith(), boss_zuljin::JustEngagedWith(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::JustEngagedWith(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::JustEngagedWith(), boss_bjarngrim::boss_bjarngrimAI::JustEngagedWith(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::JustEngagedWith(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::JustEngagedWith(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::JustEngagedWith(), boss_nalorakk::JustEngagedWith(), npc_hivezara_stinger::JustEngagedWith(), boss_vem::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_faerlina::boss_faerlinaAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), boss_hydross_the_unstable::JustReachedHome(), Kill(), boss_hydross_the_unstable::KilledUnit(), boss_hadronox::boss_hadronoxAI::KilledUnit(), Creature::LoadCreaturesAddon(), MeleeDamageBonusDone(), ModSpellCastTime(), npc_love_in_air_supply_sentry::MoveInLineOfSight(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::MoveInLineOfSight(), npc_custodian_of_time::npc_custodian_of_timeAI::MoveInLineOfSight(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), npc_daranelle::npc_daranelleAI::MoveInLineOfSight(), boss_lady_vashj::MovementInform(), boss_felmyst::MovementInform(), boss_kagani_nightstrike::MovementInform(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_pet_gen_argent_pony_bridle::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_aged_dying_ancient_kodo::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_innkeeper::OnGossipHello(), go_orb_of_domination::OnGossipHello(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_innkeeper::OnGossipSelect(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnPlayerEnter(), MidsummerPlayerScript::OnPlayerUpdateZone(), spell_azjol_nerub_web_wrap_aura::OnRemove(), spell_icc_web_wrap_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), at_karazhan_atiesh_aran::OnTrigger(), at_hor_battered_hilt_start::OnTrigger(), at_hor_battered_hilt_throw::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), at_commander_dawnforge::OnTrigger(), Acore::FriendlyMissingBuffInRange::operator()(), NotInStomachSelector::operator()(), SindragosaIceTombCheck::operator()(), DefaultTargetSelector::operator()(), VampiricBiteTargetSelector::operator()(), LastPhaseIceTombTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), WebTargetSelector::operator()(), ShadowOfDeathSelector::operator()(), Acore::UnitAuraCheck::operator()(), SpectralBlastCheck::operator()(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Player::ReportedAfkBy(), npc_corrupted_totem::Reset(), boss_janalai::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), boss_magus_telestra::Reset(), boss_illidan_stormrage::Reset(), boss_fathomlord_karathress::Reset(), Player::RewardHonor(), RewardRage(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_jormungarAI::ScheduleEvents(), boss_supremus::SchedulePhase(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), boss_anomalus::SetData(), npc_thassarian2::npc_thassarian2AI::sGossipHello(), npc_chesspiece::sGossipHello(), npc_omen::npc_omenAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), npc_necropolis::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::SpellHit(), npc_necrotic_shard::SpellHit(), npc_greengill_slave::npc_greengill_slaveAI::SpellHit(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::SpellHit(), SpellPctDamageModsDone(), SpellTakenCritChance(), Player::StoreItem(), boss_moam::SummonedCreatureDies(), boss_apothecary_hummel::boss_apothecary_hummelAI::SummonedCreatureDies(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), npc_cyclone::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_moam::UpdateAI(), boss_ossirian::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_beryl_sorcerer::npc_beryl_sorcererAI::UpdateAI(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), npc_dark_fiend::UpdateAI(), Player::UpdateAreaDependentAuras(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI(), boss_netherspite::UpdatePortals(), Player::UpdateZoneDependentAuras(), and Spell::WriteAmmoToPacket().

◆ HasAuraEffect()

bool Unit::HasAuraEffect ( uint32  spellId,
uint8  effIndex,
ObjectGuid  caster = ObjectGuid::Empty 
) const
5725{
5726 AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId);
5727 for (AuraApplicationMap::const_iterator itr = range.first; itr != range.second; ++itr)
5728 {
5729 if (itr->second->HasEffect(effIndex)
5730 && (!caster || itr->second->GetBase()->GetCasterGUID() == caster))
5731 {
5732 return true;
5733 }
5734 }
5735 return false;
5736}

References m_appliedAuras.

Referenced by Spell::CanAutoCast(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), spell_q12683_take_sputum_sample::HandleDummy(), AchievementCriteriaData::Meets(), and boss_headless_horseman::UpdateAI().

◆ HasAuras()

bool Unit::HasAuras ( SearchMethod  sm,
std::vector< uint32 > &  spellIds 
) const

Check if unit has ANY or ALL specified auras.

Parameters
smThe search method to use
spellIdsList of spell id's to check for on the unit.
Returns
Returns true if the search method condition is met. Otherwise false.
5755{
5756 if (sm == SearchMethod::MatchAll)
5757 {
5758 for (auto const& spellId : spellIds)
5759 if (!HasAura(spellId))
5760 return false;
5761 return true;
5762 }
5763 else if (sm == SearchMethod::MatchAny)
5764 {
5765 for (auto const& spellId : spellIds)
5766 if (HasAura(spellId))
5767 return true;
5768 return false;
5769 }
5770 else
5771 {
5772 LOG_ERROR("entities.unit", "Unit::HasAuras using non-supported SearchMethod {}", sm);
5773 return false;
5774 }
5775}

References HasAura(), LOG_ERROR, MatchAll, and MatchAny.

Referenced by HasAllAuras(), and HasAnyAuras().

◆ HasAuraState()

bool Unit::HasAuraState ( AuraStateType  flag,
SpellInfo const *  spellProto = nullptr,
Unit const *  Caster = nullptr 
) const
10634{
10635 if (Caster)
10636 {
10637 if (spellProto)
10638 {
10639 AuraEffectList const& stateAuras = Caster->GetAuraEffectsByType(SPELL_AURA_ABILITY_IGNORE_AURASTATE);
10640 for (AuraEffectList::const_iterator j = stateAuras.begin(); j != stateAuras.end(); ++j)
10641 if ((*j)->IsAffectedOnSpell(spellProto))
10642 return true;
10643 }
10644 // Check per caster aura state
10645 // If aura with aurastate by caster not found return false
10646 if ((1 << (flag - 1)) & PER_CASTER_AURA_STATE_MASK)
10647 {
10648 AuraStateAurasMapBounds range = m_auraStateAuras.equal_range(flag);
10649 for (AuraStateAurasMap::const_iterator itr = range.first; itr != range.second; ++itr)
10650 if (itr->second->GetBase()->GetCasterGUID() == Caster->GetGUID())
10651 return true;
10652 return false;
10653 }
10654 }
10655
10656 return HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10657}
@ SPELL_AURA_ABILITY_IGNORE_AURASTATE
Definition SpellAuraDefines.h:325
std::pair< AuraStateAurasMap::const_iterator, AuraStateAurasMap::const_iterator > AuraStateAurasMapBounds
Definition Unit.h:634

References GetAuraEffectsByType(), Object::GetGUID(), Object::HasFlag(), m_auraStateAuras, PER_CASTER_AURA_STATE_MASK, SPELL_AURA_ABILITY_IGNORE_AURASTATE, and UNIT_FIELD_AURASTATE.

Referenced by Player::_addSpell(), Pet::addSpell(), Spell::CheckCast(), spell_sha_earthliving_weapon::CheckProc(), SpellInfo::CheckTarget(), ClearAllReactives(), Spell::EffectHeal(), Spell::EffectSchoolDMG(), Spell::EffectWeaponDmg(), spell_warr_sweeping_strikes::HandleProc(), HandleProcTriggerSpell(), isFrozen(), Player::LoadFromDB(), MeleeDamageBonusDone(), SpellPctDamageModsDone(), SpellTakenCritChance(), and UpdateReactives().

◆ HasAuraType()

bool Unit::HasAuraType ( AuraType  auraType) const
5785{
5786 return (!m_modAuras[auraType].empty());
5787}

References m_modAuras.

Referenced by Player::CanTameExoticPets(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraEmpathy(), AuraEffect::HandleAuraFeatherFall(), AuraEffect::HandleAuraHover(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleAuraModStalked(), AuraEffect::HandleAuraTrackStealthed(), AuraEffect::HandleAuraUntrackable(), AuraEffect::HandleAuraWaterWalk(), AuraEffect::HandleComprehendLanguage(), AuraEffect::HandleForceMoveForward(), HasAllowOnlyAbilityAura(), HasAOECharmAura(), HasAttackerSpellCritChanceAura(), HasAuraTypeWithFamilyFlags(), HasCloneCasterAura(), HasConfuseAura(), HasControlVehicleAura(), HasDecreaseSpeedAura(), HasDetectAmoreAura(), HasDetectSpellsAura(), HasFearAura(), HasFeatherFallAura(), HasFlyAura(), HasGhostAura(), HasHealthRegenInCombatAura(), HasHoverAura(), HasIgnoreHitDirectionAura(), HasIgnoreTargetResistAura(), HasIncreaseMountedFlightSpeedAura(), HasIncreaseMountedSpeedAura(), HasInterruptRegenAura(), HasInvisibilityAura(), HasInvisibilityDetectAura(), HasMountedAura(), HasNoPVPCreditAura(), HasOpenStableAura(), HasPacifyAura(), HasPacifySilenceAura(), HasPeriodicDummyAura(), HasPreventDurabilityLossAura(), HasPreventResurectionAura(), HasPreventsFleeingAura(), HasReflectSpellsAura(), HasRegenDuringCombatAura(), HasRootAura(), HasShapeshiftAura(), HasSilenceAura(), HasSpellMagnetAura(), HasSpiritOfRedemptionAura(), HasStealthAura(), HasStealthDetectAura(), HasStunAura(), HasTauntAura(), HasThreatAura(), HasTransformAura(), HasUnattackableAura(), HasWaterBreathingAura(), and HasWaterWalkAura().

◆ HasAuraTypeWithAffectMask()

bool Unit::HasAuraTypeWithAffectMask ( AuraType  auratype,
SpellInfo const *  affectedSpell 
) const
5818{
5819 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5820 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5821 if ((*i)->IsAffectedOnSpell(affectedSpell))
5822 return true;
5823 return false;
5824}

References GetAuraEffectsByType().

Referenced by AuraEffect::CalculatePeriodic(), Spell::DoSpellHitOnUnit(), Spell::handle_immediate(), Aura::RefreshDuration(), and Aura::RefreshTimersWithMods().

◆ HasAuraTypeWithCaster()

bool Unit::HasAuraTypeWithCaster ( AuraType  auratype,
ObjectGuid  caster 
) const
5790{
5791 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5792 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5793 if (caster == (*i)->GetCasterGUID())
5794 return true;
5795 return false;
5796}

References GetAuraEffectsByType().

Referenced by BuildValuesUpdate(), IsAlwaysDetectableFor(), PatchValuesUpdate(), and ThreatContainer::SelectNextVictim().

◆ HasAuraTypeWithFamilyFlags()

bool Unit::HasAuraTypeWithFamilyFlags ( AuraType  auraType,
uint32  familyName,
uint32  familyFlags 
) const
780{
781 if (!HasAuraType(auraType))
782 return false;
783 AuraEffectList const& auras = GetAuraEffectsByType(auraType);
784 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
785 if (SpellInfo const* iterSpellProto = (*itr)->GetSpellInfo())
786 if (iterSpellProto->SpellFamilyName == familyName && iterSpellProto->SpellFamilyFlags[0] & familyFlags)
787 return true;
788 return false;
789}

References GetAuraEffectsByType(), and HasAuraType().

◆ HasAuraTypeWithMiscvalue()

bool Unit::HasAuraTypeWithMiscvalue ( AuraType  auratype,
int32  miscvalue 
) const
5809{
5810 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5811 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5812 if (miscvalue == (*i)->GetMiscValue())
5813 return true;
5814 return false;
5815}

References GetAuraEffectsByType().

Referenced by Player::Regenerate(), Player::UpdateManaRegen(), and Player::UpdateStats().

◆ HasAuraTypeWithTriggerSpell()

bool Unit::HasAuraTypeWithTriggerSpell ( AuraType  auratype,
uint32  triggerSpell 
) const
5836{
5837 for (AuraEffect const* aura : GetAuraEffectsByType(auratype))
5838 {
5839 if (aura->GetSpellInfo()->Effects[aura->GetEffIndex()].TriggerSpell == triggerSpell)
5840 {
5841 return true;
5842 }
5843 }
5844
5845 return false;
5846}

References GetAuraEffectsByType().

Referenced by WorldSession::HandlePetActionHelper().

◆ HasAuraTypeWithValue()

bool Unit::HasAuraTypeWithValue ( AuraType  auratype,
int32  value 
) const
5827{
5828 AuraEffectList const& mTotalAuraList = GetAuraEffectsByType(auratype);
5829 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
5830 if (value == (*i)->GetAmount())
5831 return true;
5832 return false;
5833}

References GetAuraEffectsByType().

◆ HasAuraWithMechanic()

bool Unit::HasAuraWithMechanic ( uint32  mechanicMask) const
5872{
5873 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5874 {
5875 SpellInfo const* spellInfo = iter->second->GetBase()->GetSpellInfo();
5876 if (spellInfo->Mechanic && (mechanicMask & (1 << spellInfo->Mechanic)))
5877 return true;
5878
5879 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5880 if (iter->second->HasEffect(i) && spellInfo->Effects[i].Effect && spellInfo->Effects[i].Mechanic)
5881 if (mechanicMask & (1 << spellInfo->Effects[i].Mechanic))
5882 return true;
5883 }
5884
5885 return false;
5886}

References SpellInfo::Effects, m_appliedAuras, MAX_SPELL_EFFECTS, and SpellInfo::Mechanic.

Referenced by EarthenPowerTargetSelector::operator()(), SpellPctDamageModsDone(), and SpellTakenCritChance().

◆ HasBreakableByDamageAuraType()

bool Unit::HasBreakableByDamageAuraType ( AuraType  type,
uint32  excludeAura = 0 
) const
792{
793 AuraEffectList const& auras = GetAuraEffectsByType(type);
794 for (AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
795 if ((!excludeAura || excludeAura != (*itr)->GetSpellInfo()->Id) && //Avoid self interrupt of channeled Crowd Control spells like Seduction
796 ((*itr)->GetSpellInfo()->AuraInterruptFlags & AURA_INTERRUPT_FLAG_TAKE_DAMAGE))
797 return true;
798 return false;
799}

References AURA_INTERRUPT_FLAG_TAKE_DAMAGE, and GetAuraEffectsByType().

Referenced by HasBreakableByDamageCrowdControlAura().

◆ HasBreakableByDamageCrowdControlAura()

bool Unit::HasBreakableByDamageCrowdControlAura ( Unit excludeCasterChannel = nullptr) const
802{
803 uint32 excludeAura = 0;
804 if (Spell* currentChanneledSpell = excludeCasterChannel ? excludeCasterChannel->GetCurrentSpell(CURRENT_CHANNELED_SPELL) : nullptr)
805 excludeAura = currentChanneledSpell->GetSpellInfo()->Id; //Avoid self interrupt of channeled Crowd Control spells like Seduction
806
812}
@ SPELL_AURA_MOD_FEAR
Definition SpellAuraDefines.h:70
@ SPELL_AURA_MOD_ROOT
Definition SpellAuraDefines.h:89
@ SPELL_AURA_TRANSFORM
Definition SpellAuraDefines.h:119
@ SPELL_AURA_MOD_CONFUSE
Definition SpellAuraDefines.h:68
@ SPELL_AURA_MOD_STUN
Definition SpellAuraDefines.h:75
bool HasBreakableByDamageAuraType(AuraType type, uint32 excludeAura=0) const
Definition Unit.cpp:791
Spell * GetCurrentSpell(CurrentSpellTypes spellType) const
Definition Unit.h:1495

References CURRENT_CHANNELED_SPELL, GetCurrentSpell(), HasBreakableByDamageAuraType(), SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_STUN, and SPELL_AURA_TRANSFORM.

Referenced by PetAI::CanAttack(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), CasterAI::UpdateAI(), npc_pet_gen_valkyr_guardian::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), and PetAI::UpdateAI().

◆ HasCloneCasterAura()

bool Unit::HasCloneCasterAura ( ) const
inline
@ SPELL_AURA_CLONE_CASTER
Definition SpellAuraDefines.h:310

References HasAuraType(), and SPELL_AURA_CLONE_CASTER.

Referenced by WorldSession::HandleMirrorImageDataRequest().

◆ HasConfuseAura()

bool Unit::HasConfuseAura ( ) const
inline

◆ HasControlVehicleAura()

bool Unit::HasControlVehicleAura ( ) const
inline

◆ HasDecreaseSpeedAura()

bool Unit::HasDecreaseSpeedAura ( ) const
inline

◆ HasDetectAmoreAura()

bool Unit::HasDetectAmoreAura ( ) const
inline
@ SPELL_AURA_DETECT_AMORE
Definition SpellAuraDefines.h:233

References HasAuraType(), and SPELL_AURA_DETECT_AMORE.

Referenced by AuraEffect::HandleDetectAmore().

◆ HasDetectSpellsAura()

bool Unit::HasDetectSpellsAura ( ) const
inline
@ SPELL_AURA_DEFLECT_SPELLS
Definition SpellAuraDefines.h:350

References HasAuraType(), and SPELL_AURA_DEFLECT_SPELLS.

◆ HasExtraUnitMovementFlag()

uint16 Unit::HasExtraUnitMovementFlag ( uint16  f) const
inline

◆ HasFearAura()

◆ HasFeatherFallAura()

bool Unit::HasFeatherFallAura ( ) const
inline
@ SPELL_AURA_FEATHER_FALL
Definition SpellAuraDefines.h:168

References HasAuraType(), and SPELL_AURA_FEATHER_FALL.

Referenced by Player::GetAurasForTarget(), and Player::HandleFall().

◆ HasFlyAura()

◆ HasGhostAura()

bool Unit::HasGhostAura ( ) const
inline

◆ HasHealthRegenInCombatAura()

bool Unit::HasHealthRegenInCombatAura ( ) const
inline
@ SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT
Definition SpellAuraDefines.h:224

References HasAuraType(), and SPELL_AURA_MOD_HEALTH_REGEN_IN_COMBAT.

Referenced by Player::RegenerateAll().

◆ HasHoverAura()

bool Unit::HasHoverAura ( ) const
inline
1716{ return HasAuraType(SPELL_AURA_HOVER); };
@ SPELL_AURA_HOVER
Definition SpellAuraDefines.h:169

References HasAuraType(), and SPELL_AURA_HOVER.

Referenced by Player::GetAurasForTarget(), Player::HandleFall(), and Creature::UpdateMovementFlags().

◆ HasIgnoreHitDirectionAura()

bool Unit::HasIgnoreHitDirectionAura ( ) const
inline

◆ HasIgnoreTargetResistAura()

bool Unit::HasIgnoreTargetResistAura ( ) const
inline

◆ HasIncreaseMountedFlightSpeedAura()

◆ HasIncreaseMountedSpeedAura()

bool Unit::HasIncreaseMountedSpeedAura ( ) const
inline
@ SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED
Definition SpellAuraDefines.h:95

References HasAuraType(), and SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED.

◆ HasInterruptRegenAura()

bool Unit::HasInterruptRegenAura ( ) const
inline
@ SPELL_AURA_INTERRUPT_REGEN
Definition SpellAuraDefines.h:157

References HasAuraType(), and SPELL_AURA_INTERRUPT_REGEN.

Referenced by Player::Regenerate().

◆ HasInvisibilityAura()

bool Unit::HasInvisibilityAura ( ) const
inline

◆ HasInvisibilityDetectAura()

bool Unit::HasInvisibilityDetectAura ( ) const
inline
@ SPELL_AURA_MOD_INVISIBILITY_DETECT
Definition SpellAuraDefines.h:82

References HasAuraType(), and SPELL_AURA_MOD_INVISIBILITY_DETECT.

Referenced by AuraEffect::HandleModInvisibilityDetect().

◆ HasLeewayMovement()

bool Unit::HasLeewayMovement ( ) const
inline
1643 {
1645 && !IsWalking();
1646 }
@ MOVEMENTFLAG_STRAFE_LEFT
Definition UnitDefines.h:367
@ MOVEMENTFLAG_STRAFE_RIGHT
Definition UnitDefines.h:368
bool IsWalking() const
Definition Unit.h:1621
bool HasMovementFlag(uint32 flag) const
Definition Object.h:346

References MovementInfo::HasMovementFlag(), IsWalking(), WorldObject::m_movementInfo, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_FORWARD, MOVEMENTFLAG_STRAFE_LEFT, and MOVEMENTFLAG_STRAFE_RIGHT.

Referenced by Spell::CheckRange(), and IsWithinMeleeRange().

◆ HasMainhandWeapon()

bool Unit::HasMainhandWeapon ( ) const
inline
922{ return HasWeapon(BASE_ATTACK); }
virtual bool HasWeapon(WeaponAttackType type) const =0

References BASE_ATTACK, and HasWeapon().

◆ hasMainhandWeaponForAttack()

bool Unit::hasMainhandWeaponForAttack ( ) const
inline
virtual bool HasWeaponForAttack(WeaponAttackType type) const
Definition Unit.h:927

References BASE_ATTACK, and HasWeaponForAttack().

◆ HasMainhandWeaponForAttack()

bool Unit::HasMainhandWeaponForAttack ( ) const
inline

◆ HasMountedAura()

◆ HasNegativeAuraWithAttribute()

bool Unit::HasNegativeAuraWithAttribute ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5861{
5862 for (AuraApplicationMap::const_iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end(); ++iter)
5863 {
5864 Aura const* aura = iter->second->GetBase();
5865 if (!iter->second->IsPositive() && aura->GetSpellInfo()->Attributes & flag && (!guid || aura->GetCasterGUID() == guid))
5866 return true;
5867 }
5868 return false;
5869}
uint32 Attributes
Definition SpellInfo.h:324

References SpellInfo::Attributes, Aura::GetCasterGUID(), Aura::GetSpellInfo(), and m_appliedAuras.

◆ HasNegativeAuraWithInterruptFlag()

bool Unit::HasNegativeAuraWithInterruptFlag ( uint32  flag,
ObjectGuid  guid = ObjectGuid::Empty 
)
5849{
5850 if (!(m_interruptMask & flag))
5851 return false;
5852 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end(); ++iter)
5853 {
5854 if (!(*iter)->IsPositive() && (*iter)->GetBase()->GetSpellInfo()->AuraInterruptFlags & flag && (!guid || (*iter)->GetBase()->GetCasterGUID() == guid))
5855 return true;
5856 }
5857 return false;
5858}

References m_interruptableAuras, and m_interruptMask.

Referenced by ThreatContainer::SelectNextVictim().

◆ HasNoPVPCreditAura()

bool Unit::HasNoPVPCreditAura ( ) const
inline
@ SPELL_AURA_NO_PVP_CREDIT
Definition SpellAuraDefines.h:222

References HasAuraType(), and SPELL_AURA_NO_PVP_CREDIT.

Referenced by Player::RewardHonor().

◆ HasNpcFlag()

bool Unit::HasNpcFlag ( NPCFlags  flags) const
inline
718{ return HasFlag(UNIT_NPC_FLAGS, flags) != 0; }

References Object::HasFlag(), and UNIT_NPC_FLAGS.

Referenced by Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), npc_fos_leader::npc_fos_leaderAI::DoAction(), Player::GetNPCIfCanInteractWith(), IsArmorer(), IsAuctioner(), IsBanker(), IsBattleMaster(), IsGossip(), IsGuildMaster(), IsInnkeeper(), IsQuestGiver(), IsServiceProvider(), IsSpiritGuide(), IsSpiritHealer(), IsSpiritService(), IsTabardDesigner(), IsTaxi(), IsTrainer(), IsVendor(), npc_announcer_toc5::OnGossipHello(), npc_announcer_toc10::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), NullCreatureAI::Permissible(), npc_plucky::npc_pluckyAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::Reset(), Player::SendPreparedGossip(), Player::SendQuestGiverStatusMultiple(), Player::SendTaxiNodeStatusMultiple(), WorldSession::SendTaxiStatus(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_chicken_cluck::npc_chicken_cluckAI::UpdateAI(), and Player::UpdateForQuestWorldObjects().

◆ HasOffhandWeapon()

bool Unit::HasOffhandWeapon ( ) const
inline
923{ return HasWeapon(OFF_ATTACK); }

References HasWeapon(), and OFF_ATTACK.

◆ HasOffhandWeaponForAttack()

◆ HasOpenStableAura()

bool Unit::HasOpenStableAura ( ) const
inline
@ SPELL_AURA_OPEN_STABLE
Definition SpellAuraDefines.h:355

References HasAuraType(), and SPELL_AURA_OPEN_STABLE.

◆ HasPacifyAura()

bool Unit::HasPacifyAura ( ) const
inline
@ SPELL_AURA_MOD_PACIFY
Definition SpellAuraDefines.h:88

References HasAuraType(), and SPELL_AURA_MOD_PACIFY.

Referenced by AuraEffect::HandleAuraModPacify(), and WorldSession::HandlePetActionHelper().

◆ HasPacifySilenceAura()

bool Unit::HasPacifySilenceAura ( ) const
inline

◆ HasPeriodicDummyAura()

bool Unit::HasPeriodicDummyAura ( ) const
inline

◆ HasPreventDurabilityLossAura()

bool Unit::HasPreventDurabilityLossAura ( ) const
inline
@ SPELL_AURA_PREVENT_DURABILITY_LOSS
Definition SpellAuraDefines.h:352

References HasAuraType(), and SPELL_AURA_PREVENT_DURABILITY_LOSS.

Referenced by Player::DurabilityPointsLoss().

◆ HasPreventResurectionAura()

bool Unit::HasPreventResurectionAura ( ) const
inline

◆ HasPreventsFleeingAura()

bool Unit::HasPreventsFleeingAura ( ) const
inline
@ SPELL_AURA_PREVENTS_FLEEING
Definition SpellAuraDefines.h:155

References HasAuraType(), and SPELL_AURA_PREVENTS_FLEEING.

Referenced by Creature::DoFleeToGetAssistance().

◆ HasRangedWeapon()

bool Unit::HasRangedWeapon ( ) const
inline
924{ return HasWeapon(RANGED_ATTACK); }

References HasWeapon(), and RANGED_ATTACK.

◆ HasRangedWeaponForAttack()

bool Unit::HasRangedWeaponForAttack ( ) const
inline

◆ HasReflectSpellsAura()

bool Unit::HasReflectSpellsAura ( ) const
inline
@ SPELL_AURA_REFLECT_SPELLS
Definition SpellAuraDefines.h:91

References HasAuraType(), and SPELL_AURA_REFLECT_SPELLS.

Referenced by Spell::DoSpellHitOnUnit().

◆ HasRegenDuringCombatAura()

bool Unit::HasRegenDuringCombatAura ( ) const
inline
@ SPELL_AURA_MOD_REGEN_DURING_COMBAT
Definition SpellAuraDefines.h:179

References HasAuraType(), and SPELL_AURA_MOD_REGEN_DURING_COMBAT.

Referenced by Player::RegenerateAll(), and Player::RegenerateHealth().

◆ HasRootAura()

bool Unit::HasRootAura ( ) const
inline

◆ HasShapeshiftAura()

bool Unit::HasShapeshiftAura ( ) const
inline

◆ HasSharedVision()

◆ HasSilenceAura()

bool Unit::HasSilenceAura ( ) const
inline

◆ HasSpell()

virtual bool Unit::HasSpell ( uint32  ) const
inlinevirtual

◆ HasSpellCooldown()

◆ HasSpellItemCooldown()

virtual bool Unit::HasSpellItemCooldown ( uint32  ,
uint32   
) const
inlinevirtual

Reimplemented in Player.

1263{ return false; }

Referenced by Spell::CheckCast(), and ProcDamageAndSpellFor().

◆ HasSpellMagnetAura()

bool Unit::HasSpellMagnetAura ( ) const
inline

◆ HasSpiritOfRedemptionAura()

◆ HasStealthAura()

◆ HasStealthDetectAura()

bool Unit::HasStealthDetectAura ( ) const
inline
@ SPELL_AURA_MOD_STEALTH_DETECT
Definition SpellAuraDefines.h:80

References HasAuraType(), and SPELL_AURA_MOD_STEALTH_DETECT.

Referenced by AuraEffect::HandleModStealthDetect().

◆ HasStunAura()

◆ HasTauntAura()

bool Unit::HasTauntAura ( ) const
inline
@ SPELL_AURA_MOD_TAUNT
Definition SpellAuraDefines.h:74

References HasAuraType(), and SPELL_AURA_MOD_TAUNT.

Referenced by Creature::CanCreatureAttack(), and PetAI::SelectNextTarget().

◆ HasThreatAura()

bool Unit::HasThreatAura ( ) const
inline
@ SPELL_AURA_MOD_THREAT
Definition SpellAuraDefines.h:73

References HasAuraType(), and SPELL_AURA_MOD_THREAT.

Referenced by ApplyTotalThreatModifier().

◆ HasTransformAura()

bool Unit::HasTransformAura ( ) const
inline

◆ HasUnattackableAura()

bool Unit::HasUnattackableAura ( ) const
inline

◆ HasUnitFlag()

bool Unit::HasUnitFlag ( UnitFlags  flags) const
inline
702{ return HasFlag(UNIT_FIELD_FLAGS, flags); }

References Object::HasFlag(), and UNIT_FIELD_FLAGS.

Referenced by _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), Vehicle::AddPassenger(), AttackerStateUpdate(), boss_malygos::boss_malygosAI::AttackStart(), SmartAI::AttackStart(), npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), violet_hold_trashAI::AttackStart(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::AttackStart(), npc_ravenous_worg::npc_ravenous_worgAI::AttackStart(), npc_swarm_scarab::npc_swarm_scarabAI::CanAIAttack(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanNoReagentCast(), CanSwim(), CanUseAttackType(), Spell::CheckEffectTarget(), boss_muru::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_jormungarAI::DoAction(), Spell::DoSpellHitOnUnit(), RandomMovementGenerator< T >::DoUpdate(), boss_dorothee::EnterEvadeMode(), boss_roar::EnterEvadeMode(), boss_strawman::EnterEvadeMode(), boss_tinhead::EnterEvadeMode(), boss_julianne::EnterEvadeMode(), SmartAI::EnterEvadeMode(), GetReactionTo(), GetVelocity(), spell_gen_model_visible::HandleEffectApply(), WorldSession::HandleMovementOpcodes(), spell_gen_mounted_charge::HandleScriptEffect(), IsImmuneToNPC(), IsImmuneToPC(), IsInCombat(), IsMounted(), IsPetInCombat(), isTargetableForAttack(), violet_hold_trashAI::JustEngagedWith(), boss_novos::boss_novosAI::JustSummoned(), Condition::Meets(), MotionMaster::MoveCharge(), MotionMaster::MoveChase(), MotionMaster::MoveConfused(), MotionMaster::MoveDistract(), MotionMaster::MoveFall(), MotionMaster::MoveFleeing(), MotionMaster::MoveFollow(), boss_professor_putricide::boss_professor_putricideAI::MoveInLineOfSight(), boss_palehoof::boss_palehoofAI::MoveInLineOfSight(), npc_massive_jormungar::npc_massive_jormungarAI::MoveInLineOfSight(), npc_ferocious_rhino::npc_ferocious_rhinoAI::MoveInLineOfSight(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::MoveInLineOfSight(), npc_frenzied_worgen::npc_frenzied_worgenAI::MoveInLineOfSight(), npc_shattered_hand_scout::MoveInLineOfSight(), npc_nether_drake::npc_nether_drakeAI::MoveInLineOfSight(), MotionMaster::MoveLand(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), MotionMaster::MovePath(), MotionMaster::MovePoint(), MotionMaster::MoveRandom(), MotionMaster::MoveSeekAssistance(), MotionMaster::MoveSeekAssistanceDistract(), MotionMaster::MoveSplinePath(), MotionMaster::MoveTakeoff(), MotionMaster::MoveTargetedHome(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_pet_warlock::npc_toc_pet_warlockAI::myCanCast(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Creature::reachWithSpellAttack(), Creature::reachWithSpellCure(), Creature::RefreshSwimmingFlag(), ScriptedAI::SelectSpell(), Player::SetClientControl(), SetSpeed(), boss_the_lurker_below::SummonedCreatureDies(), Player::Update(), npc_onyxian_lair_guard::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_toc_warrior::npc_toc_warriorAI::UpdateAI(), npc_toc_dk::npc_toc_dkAI::UpdateAI(), npc_toc_rogue::npc_toc_rogueAI::UpdateAI(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::UpdateAI(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), npc_power_spark::npc_power_sparkAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), npc_xt002_heart::npc_xt002_heartAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_ravenous_worg::npc_ravenous_worgAI::UpdateAI(), and Player::UpdateTriggerVisibility().

◆ HasUnitFlag2()

◆ HasUnitMovementFlag()

◆ HasUnitState()

bool Unit::HasUnitState ( const uint32  f) const
inline
691{ return (m_state & f); }

References m_state.

Referenced by Spell::_cast(), Creature::_IsTargetAcceptable(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), AddThreat(), advisor_baseAI::advisor_baseAI(), Attack(), AttackerStateUpdate(), FollowerAI::AttackStart(), npc_raging_spirit::npc_raging_spiritAI::AttackStart(), boss_alar::boss_alar(), boss_anetheron::boss_anetheron(), boss_anzu::boss_anzu(), boss_apothecary_hummel::boss_apothecary_hummelAI::boss_apothecary_hummelAI(), boss_archimonde::boss_archimonde(), boss_azgalor::boss_azgalor(), boss_azuregos::boss_azuregosAI::boss_azuregosAI(), boss_balinda::boss_balinda(), boss_bigbadwolf::boss_bigbadwolf(), boss_blackheart_the_inciter::boss_blackheart_the_inciter(), boss_blindeye_the_seer::boss_blindeye_the_seer(), boss_captain_skarloc::boss_captain_skarloc(), boss_curator::boss_curator(), boss_darkweaver_syth::boss_darkweaver_syth(), boss_dorothee::boss_dorothee(), boss_exarch_maladaar::boss_exarch_maladaar(), boss_fathomguard_caribdis::boss_fathomguard_caribdis(), boss_fathomguard_sharkkis::boss_fathomguard_sharkkis(), boss_fathomguard_tidalvess::boss_fathomguard_tidalvess(), boss_ghazan::boss_ghazan(), boss_grand_warlock_nethekurse::boss_grand_warlock_nethekurse(), boss_halazzi::boss_halazzi(), boss_hexlord_malacrass::boss_hexlord_malacrass(), boss_high_astromancer_solarian::boss_high_astromancer_solarian(), boss_high_king_maulgar::boss_high_king_maulgar(), boss_janalai::boss_janalai(), boss_jarien::boss_jarien(), boss_kazrogal::boss_kazrogal(), boss_kelidan_the_breaker::boss_kelidan_the_breaker(), boss_kiggler_the_crazed::boss_kiggler_the_crazed(), boss_kiljaeden::boss_kiljaeden(), boss_krosh_firehand::boss_krosh_firehand(), boss_lady_vashj::boss_lady_vashj(), boss_magtheridon::boss_magtheridon(), boss_maiden_of_virtue::boss_maiden_of_virtue(), boss_mekgineer_steamrigger::boss_mekgineer_steamrigger(), boss_mennu_the_betrayer::boss_mennu_the_betrayer(), boss_mor_grayhoof::boss_mor_grayhoof(), boss_moroes::boss_moroes(), boss_morogrim_tidewalker::boss_morogrim_tidewalker(), boss_murmur::boss_murmur(), boss_nazan::boss_nazan(), boss_nexusprince_shaffar::boss_nexusprince_shaffar(), boss_olm_the_summoner::boss_olm_the_summoner(), boss_omor_the_unscarred::boss_omor_the_unscarred(), boss_pandemonius::boss_pandemonius(), boss_quagmirran::boss_quagmirran(), boss_rage_winterchill::boss_rage_winterchill(), boss_roar::boss_roar(), boss_rokmar_the_crackler::boss_rokmar_the_crackler(), boss_shirrak_the_dead_watcher::boss_shirrak_the_dead_watcher(), boss_sothos::boss_sothos(), boss_strawman::boss_strawman(), boss_supremus::boss_supremus(), boss_swamplord_muselek::boss_swamplord_muselek(), boss_taldaram::boss_taldaram(), boss_talon_king_ikiss::boss_talon_king_ikiss(), boss_tavarok::boss_tavarok(), boss_terestian_illhoof::boss_terestian_illhoof(), boss_the_black_stalker::boss_the_black_stalker(), boss_the_maker::boss_the_maker(), boss_tinhead::boss_tinhead(), boss_vazruden::boss_vazruden(), boss_void_reaver::boss_void_reaver(), boss_warbringer_omrogg::boss_warbringer_omrogg(), boss_warchief_kargath_bladefist::boss_warchief_kargath_bladefist(), boss_watchkeeper_gargolmar::boss_watchkeeper_gargolmar(), PathGenerator::CalculatePath(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::CanAIAttack(), boss_gurtogg_bloodboil::CanAIAttack(), PetAI::CanAttack(), Player::CanEquipItem(), CanFreeMove(), Creature::CanPeriodicallyCallForAssistance(), Creature::CanStartAttack(), spell_dk_death_grip::CheckCast(), Spell::CheckCast(), Spell::CheckPetCast(), spell_warr_retaliation::CheckProc(), SpellInfo::CheckTarget(), CreatureUnitRelocationWorker(), boss_garfrost::boss_garfrostAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), DealDamage(), DealMeleeDamage(), DisableRotate(), UnitAI::DoCast(), UnitAI::DoCastAOE(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), UnitAI::DoSpellAttackIfReady(), UnitAI::DoSpellAttackToRandomTargetIfReady(), Spell::DoSpellHitOnUnit(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), Spell::EffectDistract(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), Spell::EffectKnockBack(), CritterAI::EnterEvadeMode(), SmartAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Spell::finish(), Player::GetInitialVisiblePackets(), WorldSession::HandleAuctionListItems(), spell_dru_starfall_dummy::HandleDummy(), WorldSession::HandleEmoteOpcode(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleMoveTeleportAck(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandlePlayerLoginFromDB(), WorldSession::HandlePlayerLoginToCharInWorld(), AuraEffect::HandleProcTriggerDamageAuraProc(), ArenaSpectator::HandleSpectatorSpectateCommand(), boss_venoxis::InitializeAI(), isAttackingPlayer(), boss_faction_championsAI::IsCCed(), Creature::IsInEvadeMode(), IsInFlight(), IsMovementPreventedByCasting(), Creature::IsMovementPreventedByCasting(), isPossessed(), isPossessedByPlayer(), isSpellBlocked(), IsStopped(), isTargetableForAttack(), Creature::IsUpdateNeeded(), IsValidCombatTarget(), CritterAI::JustEngagedWith(), boss_priestess_delrissa::JustEngagedWith(), npc_coren_direbrew_sisters::JustEngagedWith(), boss_yoggsaron_keeper::JustEngagedWith(), boss_essence_of_desire::boss_essence_of_desireAI::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_kagani_nightstrike::JustEngagedWith(), PetAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), GridObjectLoader::LoadCreatures(), MagicSpellHitResult(), MeleeSpellHitResult(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), SmartAI::MoveInLineOfSight(), boss_kaelthas::MovementInform(), npc_toc_druid::npc_toc_druidAI::myCanCast(), npc_toc_shaman::npc_toc_shamanAI::myCanCast(), npc_toc_paladin::npc_toc_paladinAI::myCanCast(), npc_toc_priest::npc_toc_priestAI::myCanCast(), npc_toc_shadow_priest::npc_toc_shadow_priestAI::myCanCast(), npc_toc_warlock::npc_toc_warlockAI::myCanCast(), npc_toc_mage::npc_toc_mageAI::myCanCast(), npc_toc_hunter::npc_toc_hunterAI::myCanCast(), npc_toc_boomkin::npc_toc_boomkinAI::myCanCast(), npc_toc_warrior::npc_toc_warriorAI::myCanCast(), npc_toc_dk::npc_toc_dkAI::myCanCast(), npc_toc_rogue::npc_toc_rogueAI::myCanCast(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::myCanCast(), npc_toc_retro_paladin::npc_toc_retro_paladinAI::myCanCast(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), npc_apothecary_baxter::npc_apothecary_baxter(), npc_batrider::npc_batrider(), npc_hyjal_frost_wyrm::npc_hyjal_frost_wyrm(), npc_hyjal_gargoyle::npc_hyjal_gargoyle(), npc_hyjal_ground_trash::npc_hyjal_ground_trash(), npc_icc_spire_frostwyrm::npc_icc_spire_frostwyrm(), npc_inner_demon::npc_inner_demon(), npc_kiljaeden_controller::npc_kiljaeden_controller(), npc_sunblade_arch_mage::npc_sunblade_arch_mage(), Acore::FriendlyCCedInRange::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessAction(), RemoveCharmedBy(), boss_kormok::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), npc_ohgan::npc_ohganAI::Reset(), boss_thekal::Reset(), npc_zealot_lorkhan::Reset(), npc_zealot_zath::Reset(), boss_isalien::Reset(), npc_anubisath_guardian::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_ashtongue_channeler::Reset(), RollMeleeOutcomeAgainst(), boss_faction_championsAI::SelectEnemyCaster(), ThreatContainer::SelectNextVictim(), Player::SetClientControl(), SetContestedPvP(), SetControlled(), Creature::SetDisableGravity(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), Creature::SetHover(), SetInCombatState(), SetInFront(), SetRooted(), SetStunned(), WaypointMovementGenerator< Creature >::StartMove(), lfg::LFGMgr::TeleportPlayer(), CreatureAI::TriggerAlert(), Creature::Update(), Player::Update(), Update(), TimedFleeingMovementGenerator::Update(), boss_sartharion_dragonAI::UpdateAI(), CombatAI::UpdateAI(), CasterAI::UpdateAI(), BossAI::UpdateAI(), WorldBossAI::UpdateAI(), npc_av_marshal_or_warmaster::npc_av_marshal_or_warmasterAI::UpdateAI(), ironhand_guardian::ironhand_guardianAI::UpdateAI(), boss_anubshiah::boss_anubshiahAI::UpdateAI(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::UpdateAI(), boss_eviscerator::boss_evisceratorAI::UpdateAI(), boss_gorosh_the_dervish::boss_gorosh_the_dervishAI::UpdateAI(), boss_grizzle::boss_grizzleAI::UpdateAI(), boss_hedrum::boss_hedrumAI::UpdateAI(), boss_moira_bronzebeardAI::UpdateAI(), boss_high_priestess_thaurissanAI::UpdateAI(), boss_okthor::boss_okthorAI::UpdateAI(), boss_drakkisath::boss_drakkisathAI::UpdateAI(), boss_halycon::boss_halyconAI::UpdateAI(), boss_highlord_omokk::boss_highlordomokkAI::UpdateAI(), boss_lord_valthalak::boss_lord_valthalakAI::UpdateAI(), boss_overlord_wyrmthalak::boss_overlordwyrmthalakAI::UpdateAI(), boss_quartermaster_zigris::UpdateAI(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_solakar_flamewreath::boss_solakar_flamewreathAI::UpdateAI(), boss_the_beast::boss_thebeastAI::UpdateAI(), boss_urok_doomhowl::boss_urok_doomhowlAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_chromaggus::boss_chromaggusAI::UpdateAI(), boss_ebonroc::boss_ebonrocAI::UpdateAI(), boss_firemaw::boss_firemawAI::UpdateAI(), boss_flamegor::boss_flamegorAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_nefarian::UpdateAI(), boss_razorgore::boss_razorgoreAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_garr::boss_garrAI::UpdateAI(), boss_golemagg::boss_golemaggAI::UpdateAI(), npc_core_rager::npc_core_ragerAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_flamewaker_priest::npc_flamewaker_priestAI::UpdateAI(), npc_mc_core_hound::npc_mc_core_houndAI::UpdateAI(), boss_netherspite::UpdateAI(), boss_servant_quarters::UpdateAI(), npc_kilrek::UpdateAI(), boss_priestess_lackey_commonAI::UpdateAI(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_lady_sylvanas_windrunner::npc_lady_sylvanas_windrunnerAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_jaina_proudmoore_bfu::npc_jaina_proudmoore_bfuAI::UpdateAI(), boss_blight_worm::boss_blight_wormAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_grilek::boss_grilekAI::UpdateAI(), boss_hakkar::boss_hakkarAI::UpdateAI(), boss_hazzarah::UpdateAI(), boss_jindo::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_wushoolay::boss_wushoolayAI::UpdateAI(), npc_coren_direbrew::UpdateAI(), npc_hallows_end_soh::UpdateAI(), boss_headless_horseman::UpdateAI(), boss_epoch::boss_epochAI::UpdateAI(), boss_infinite_corruptor::boss_infinite_corruptorAI::UpdateAI(), boss_mal_ganis::boss_mal_ganisAI::UpdateAI(), boss_meathook::boss_meathookAI::UpdateAI(), boss_salramm::boss_salrammAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), boss_lieutenant_drake::UpdateAI(), boss_onyxia::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), npc_belnistrasz::npc_belnistraszAI::UpdateAI(), npc_shadowpriest_sezziz::npc_shadowpriest_sezzizAI::UpdateAI(), boss_elder_nadox::UpdateAI(), boss_volazj::UpdateAI(), boss_jedoga_shadowseeker::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_hadronox::boss_hadronoxAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_krik_thir::boss_krik_thirAI::UpdateAI(), boss_sartharion::boss_sartharionAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), npc_baltharus_the_warborn_clone::npc_baltharus_the_warborn_cloneAI::UpdateAI(), boss_general_zarithrian::boss_general_zarithrianAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_saviana_ragefire::boss_saviana_ragefireAI::UpdateAI(), boss_eadric::boss_eadricAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), npc_argent_soldier::npc_argent_soldierAI::UpdateAI(), boss_black_knight::boss_black_knightAI::UpdateAI(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::UpdateAI(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_toc_hunter::npc_toc_hunterAI::UpdateAI(), boss_jaraxxus::boss_jaraxxusAI::UpdateAI(), npc_fel_infernal::npc_fel_infernalAI::UpdateAI(), npc_mistress_of_pain::npc_mistress_of_painAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_twin_valkyrAI::UpdateAI(), boss_dred::boss_dredAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), boss_trollgore::boss_trollgoreAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_fos_corrupted_soul_fragment::npc_fos_corrupted_soul_fragmentAI::UpdateAI(), boss_devourer_of_souls::boss_devourer_of_soulsAI::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_ghostly_priest::npc_ghostly_priestAI::UpdateAI(), npc_phantom_mage::npc_phantom_mageAI::UpdateAI(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::UpdateAI(), npc_spectral_footman::npc_spectral_footmanAI::UpdateAI(), npc_tortured_rifleman::npc_tortured_riflemanAI::UpdateAI(), boss_frostsworn_general::boss_frostsworn_generalAI::UpdateAI(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::UpdateAI(), npc_hor_risen_witch_doctor::npc_hor_risen_witch_doctorAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_gal_darah::boss_gal_darahAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::UpdateAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::UpdateAI(), boss_festergut::boss_festergutAI::UpdateAI(), npc_stinky_icc::npc_stinky_iccAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_leader::npc_gunship_boarding_leaderAI::UpdateAI(), npc_gunship_boarding_add::npc_gunship_boarding_add_realAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_precious_icc::npc_precious_iccAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_spinestalker::npc_spinestalkerAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), npc_gluttonous_abomination::npc_gluttonous_abominationAI::UpdateAI(), npc_rotting_frost_giant::npc_rotting_frost_giantAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_sister_svalna::boss_sister_svalnaAI::UpdateAI(), npc_captain_arnath::npc_captain_arnathAI::UpdateAI(), npc_captain_brandon::npc_captain_brandonAI::UpdateAI(), npc_captain_grondel::npc_captain_grondelAI::UpdateAI(), npc_captain_rupert::npc_captain_rupertAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), npc_icc_skybreaker_hierophant::npc_icc_skybreaker_hierophantAI::UpdateAI(), npc_icc_skybreaker_marksman::npc_icc_skybreaker_marksmanAI::UpdateAI(), npc_icc_skybreaker_vicar::npc_icc_skybreaker_vicarAI::UpdateAI(), npc_icc_skybreaker_luminary::npc_icc_skybreaker_luminaryAI::UpdateAI(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::UpdateAI(), npc_icc_severed_essence::npc_icc_severed_essenceAI::UpdateAI(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::UpdateAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::UpdateAI(), boss_isle_of_conquest::boss_isle_of_conquestAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_loatheb::boss_loathebAI::UpdateAI(), boss_maexxna::boss_maexxnaAI::UpdateAI(), boss_noth::boss_nothAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_razuvious_minion::boss_razuvious_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_nexus_lord::npc_nexus_lordAI::UpdateAI(), npc_scion_of_eternity::npc_scion_of_eternityAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_drakos::boss_drakosAI::UpdateAI(), boss_eregos::boss_eregosAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_volkhan::boss_volkhanAI::UpdateAI(), npc_molten_golem::npc_molten_golemAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_krystallus::boss_krystallusAI::UpdateAI(), boss_maiden_of_grief::boss_maiden_of_griefAI::UpdateAI(), boss_sjonnir::boss_sjonnirAI::UpdateAI(), boss_sjonnir_iron_sludge::boss_sjonnir_iron_sludgeAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_steelbreaker::boss_steelbreakerAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_auriaya::boss_auriayaAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_stonebark::boss_freya_elder_stonebarkAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), boss_freya_elder_ironbranch::boss_freya_elder_ironbranchAI::UpdateAI(), boss_freya_summons::boss_freya_summonsAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), npc_ulduar_hodir_priest::npc_ulduar_hodir_priestAI::UpdateAI(), npc_ulduar_hodir_druid::npc_ulduar_hodir_druidAI::UpdateAI(), npc_ulduar_hodir_shaman::npc_ulduar_hodir_shamanAI::UpdateAI(), npc_ulduar_hodir_mage::npc_ulduar_hodir_mageAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim::boss_thorimAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::UpdateAI(), boss_thorim_gauntlet_npcs::boss_thorim_gauntlet_npcsAI::UpdateAI(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::UpdateAI(), boss_thorim_ancient_rune_giant::boss_thorim_ancient_rune_giantAI::UpdateAI(), boss_thorim_arena_npcs::boss_thorim_arena_npcsAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_yoggsaron::boss_yoggsaronAI::UpdateAI(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_ulduar_storm_tempered_keeper::npc_ulduar_storm_tempered_keeperAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), boss_dalronn_the_controller::UpdateAI(), npc_enslaved_proto_drake::UpdateAI(), npc_massive_jormungar::npc_massive_jormungarAI::UpdateAI(), npc_ferocious_rhino::npc_ferocious_rhinoAI::UpdateAI(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::UpdateAI(), npc_frenzied_worgen::npc_frenzied_worgenAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), boss_archavon::boss_archavonAI::UpdateAI(), boss_emalon::boss_emalonAI::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), boss_toravon::boss_toravonAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_erekem_guard::npc_erekem_guardAI::UpdateAI(), boss_lavanthor::boss_lavanthorAI::UpdateAI(), boss_moragg::boss_moraggAI::UpdateAI(), boss_xevozz::boss_xevozzAI::UpdateAI(), boss_zuramat::boss_zuramatAI::UpdateAI(), npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_exarch_maladaar::UpdateAI(), boss_nexusprince_shaffar::UpdateAI(), npc_yor::UpdateAI(), boss_anzu::UpdateAI(), npc_maiev_illidan::UpdateAI(), boss_gathios_the_shatterer::UpdateAI(), boss_high_nethermancer_zerevor::UpdateAI(), boss_lady_malande::UpdateAI(), boss_veras_darkshadow::UpdateAI(), boss_essence_of_suffering::boss_essence_of_sufferingAI::UpdateAI(), boss_essence_of_desire::boss_essence_of_desireAI::UpdateAI(), boss_essence_of_anger::boss_essence_of_angerAI::UpdateAI(), boss_doomlord_kazzak::boss_doomlordkazzakAI::UpdateAI(), boss_doomwalker::UpdateAI(), boss_leotheras_the_blind::UpdateAI(), boss_gruul::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), boss_watchkeeper_gargolmar::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), boss_alar::UpdateAI(), advisor_baseAI::UpdateAI(), npc_maghar_captive::npc_maghar_captiveAI::UpdateAI(), npc_enslaved_netherwing_drake::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), npc_pet_dk_ebon_gargoyle::UpdateAI(), npc_pet_gen_target_following_bomb::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), emerald_dragonAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), PetAI::UpdateAI(), npc_orb_carrier::npc_orb_carrierAI::UpdateAI(), npc_hor_raging_ghoul::npc_hor_raging_ghoulAI::UpdateAI(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::UpdateAI(), npc_wg_spirit_guide::npc_wg_spirit_guideAI::UpdateAI(), Player::UpdateCharmedAI(), npc_general_andorov::UpdateEscortAI(), npc_onyx_flamecaller::npc_onyx_flamecallerAI::UpdateEscortAI(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), npc_kurenai_captive::npc_kurenai_captiveAI::UpdateEscortAI(), npc_isla_starmane::npc_isla_starmaneAI::UpdateEscortAI(), SmartAI::UpdatePath(), and SmartScript::UpdateTimer().

◆ HasUnitTypeMask()

◆ HasVisibleAuraType()

bool Unit::HasVisibleAuraType ( AuraType  auraType) const
5799{
5800 AuraEffectList const& mAuraList = GetAuraEffectsByType(auraType);
5801 for (AuraEffectList::const_iterator i = mAuraList.begin(); i != mAuraList.end(); ++i)
5802 if ((*i)->GetBase()->CanBeSentToClient())
5803 return true;
5804
5805 return false;
5806}

References GetAuraEffectsByType().

◆ HasWaterBreathingAura()

bool Unit::HasWaterBreathingAura ( ) const
inline
@ SPELL_AURA_WATER_BREATHING
Definition SpellAuraDefines.h:145

References HasAuraType(), and SPELL_AURA_WATER_BREATHING.

Referenced by Player::getMaxTimer().

◆ HasWaterWalkAura()

bool Unit::HasWaterWalkAura ( ) const
inline
@ SPELL_AURA_WATER_WALK
Definition SpellAuraDefines.h:167

References HasAuraType(), and SPELL_AURA_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ HasWeapon()

virtual bool Unit::HasWeapon ( WeaponAttackType  type) const
pure virtual

Implemented in Creature, and Player.

Referenced by HasMainhandWeapon(), HasOffhandWeapon(), and HasRangedWeapon().

◆ HasWeaponForAttack()

virtual bool Unit::HasWeaponForAttack ( WeaponAttackType  type) const
inlinevirtual

Reimplemented in Creature, and Player.

927{ return CanUseAttackType(type); }
bool CanUseAttackType(uint8 attacktype) const
Definition Unit.h:931

References CanUseAttackType().

Referenced by hasMainhandWeaponForAttack(), HasMainhandWeaponForAttack(), HasOffhandWeaponForAttack(), HasRangedWeaponForAttack(), Creature::HasWeaponForAttack(), and Player::HasWeaponForAttack().

◆ haveOffhandWeapon()

bool Unit::haveOffhandWeapon ( ) const
523{
524 if (Player const* player = ToPlayer())
525 return player->GetWeaponForAttack(OFF_ATTACK, true);
526
527 return CanDualWield();
528}
bool CanDualWield() const
Definition Unit.h:918

References CanDualWield(), OFF_ATTACK, and Object::ToPlayer().

Referenced by boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), and boss_twin_valkyrAI::myDoMeleeAttackIfReady().

◆ HealBySpell()

int32 Unit::HealBySpell ( HealInfo healInfo,
bool  critical = false 
)
11328{
11329 uint32 heal = healInfo.GetHeal();
11330 sScriptMgr->ModifyHealReceived(this, healInfo.GetTarget(), heal, healInfo.GetSpellInfo());
11331 healInfo.SetHeal(heal);
11332
11333 // calculate heal absorb and reduce healing
11334 CalcHealAbsorb(healInfo);
11335
11336 int32 gain = Unit::DealHeal(healInfo.GetHealer(), healInfo.GetTarget(), healInfo.GetHeal());
11337 healInfo.SetEffectiveHeal(gain);
11338
11339 SendHealSpellLog(healInfo, critical);
11340 return gain;
11341}
Unit * GetHealer() const
Definition Unit.h:411
void SetHeal(uint32 amount)
Definition Unit.h:401
void SetEffectiveHeal(uint32 amount)
Definition Unit.h:406
static void CalcHealAbsorb(HealInfo &healInfo)
Definition Unit.cpp:2528
static int32 DealHeal(Unit *healer, Unit *victim, uint32 addhealth)
Definition Unit.cpp:11037
void SendHealSpellLog(HealInfo const &healInfo, bool critical=false)
Definition Unit.cpp:11310

References CalcHealAbsorb(), DealHeal(), HealInfo::GetHeal(), HealInfo::GetHealer(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SendHealSpellLog(), HealInfo::SetEffectiveHeal(), HealInfo::SetHeal(), and sScriptMgr.

Referenced by Spell::DoAllEffectOnTarget(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ HealthAbovePct()

◆ HealthAbovePctHealed()

bool Unit::HealthAbovePctHealed ( int32  pct,
uint32  heal 
) const
inline

◆ HealthBelowPct()

bool Unit::HealthBelowPct ( int32  pct) const
inline
1039{ return GetHealth() < CountPctFromMaxHealth(pct); }

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_moira_bronzebeardAI::CastOnEmperorIfPossible(), boss_mor_grayhoof::DamageTaken(), boss_isalien::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), HandleDummyAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), HandleProcTriggerSpell(), ScriptedAI::HealthBelowPct(), boss_kalec::JustEngagedWith(), boss_sathrovarr::JustEngagedWith(), npc_akama_illidan::JustEngagedWith(), npc_maiev_illidan::JustEngagedWith(), boss_olm_the_summoner::JustEngagedWith(), boss_priestess_lackey_commonAI::JustEngagedWith(), boss_yazzai::JustEngagedWith(), boss_grand_warlock_nethekurse::JustEngagedWith(), Player::LoadFromDB(), npc_death_knight_initiate::OnGossipHello(), SetHealth(), SpellPctHealingModsDone(), Update(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), npc_sentinel_leader::UpdateAI(), npc_sentinel_infiltrator::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::UpdateAI(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), boss_twilight_halion::boss_twilight_halionAI::UpdateAI(), boss_tharon_ja::boss_tharon_jaAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_drakkari_elemental::boss_drakkari_elementalAI::UpdateAI(), boss_eck::boss_eckAI::UpdateAI(), boss_slad_ran::boss_slad_ranAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_anomalus::UpdateAI(), boss_keristrasza::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_ormorok::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), boss_grand_warlock_nethekurse::UpdateAI(), and npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateEscortAI().

◆ HealthBelowPctDamaged()

bool Unit::HealthBelowPctDamaged ( int32  pct,
uint32  damage 
) const
inline
1040{ return int64(GetHealth()) - int64(damage) < int64(CountPctFromMaxHealth(pct)); }
std::int64_t int64
Definition Define.h:102

References CountPctFromMaxHealth(), and GetHealth().

Referenced by boss_mandokir::boss_mandokirAI::DamageDealt(), boss_lord_valthalak::boss_lord_valthalakAI::DamageTaken(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::DamageTaken(), boss_quartermaster_zigris::DamageTaken(), boss_warmaster_voone::boss_warmastervooneAI::DamageTaken(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_golemagg::boss_golemaggAI::DamageTaken(), npc_core_rager::npc_core_ragerAI::DamageTaken(), boss_attumen::DamageTaken(), boss_midnight::DamageTaken(), boss_kormok::DamageTaken(), npc_batrider::DamageTaken(), npc_coren_direbrew::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_onyxia::DamageTaken(), npc_anubisath_guardian::DamageTaken(), boss_ouro::DamageTaken(), npc_anubisath_sentinel::aqsentinelAI::DamageTaken(), npc_anubisath_defender::DamageTaken(), boss_elder_nadox::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_sartharion::boss_sartharionAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_gunship::npc_gunshipAI::DamageTaken(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::DamageTaken(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::DamageTaken(), npc_gunship_boarding_addAI::DamageTaken(), npc_shambling_horror_icc::npc_shambling_horror_iccAI::DamageTaken(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::DamageTaken(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::DamageTaken(), boss_malygos::boss_malygosAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), npc_xt002_boombot::npc_xt002_boombotAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_akama_shade::DamageTaken(), boss_vazruden::DamageTaken(), npc_millhouse_manastorm::npc_millhouse_manastormAI::DamageTaken(), npc_magister_aledis::DamageTaken(), BossAI::DamageTaken(), boss_halazzi::DamageTaken(), boss_buru::DamageTaken(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DamageTaken(), boss_bug_trio::DamageTaken(), boss_hadronox::boss_hadronoxAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), and HandleProcTriggerSpell().

◆ IncrDiminishing()

void Unit::IncrDiminishing ( DiminishingGroup  group)
15124{
15125 // Checking for existing in the table
15126 for (Diminishing::iterator i = m_Diminishing.begin(); i != m_Diminishing.end(); ++i)
15127 {
15128 if (i->DRGroup != group)
15129 continue;
15130 if (int32(i->hitCount) < GetDiminishingReturnsMaxLevel(group))
15131 i->hitCount += 1;
15132 return;
15133 }
15135}
DiminishingLevels GetDiminishingReturnsMaxLevel(DiminishingGroup group)
Definition SpellMgr.cpp:264
Definition Unit.h:273

References DIMINISHING_LEVEL_2, GetDiminishingReturnsMaxLevel(), GameTime::GetGameTimeMS(), and m_Diminishing.

Referenced by Spell::DoSpellHitOnUnit().

◆ InitCharmInfo()

CharmInfo * Unit::InitCharmInfo ( )
15888{
15889 if (!m_charmInfo)
15890 m_charmInfo = new CharmInfo(this);
15891
15892 return m_charmInfo;
15893}
Definition CharmInfo.h:127

References m_charmInfo.

Referenced by Guardian::Guardian(), Pet::Pet(), and SetCharmedBy().

◆ InitStatBuffMods()

void Unit::InitStatBuffMods ( )
inline
1009 {
1010 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_POSSTAT0) + i, 0);
1011 for (uint8 i = STAT_STRENGTH; i < MAX_STATS; ++i) SetFloatValue(static_cast<uint16>(UNIT_FIELD_NEGSTAT0) + i, 0);
1012 }

References STAT_STRENGTH, UNIT_FIELD_NEGSTAT0, and UNIT_FIELD_POSSTAT0.

Referenced by Player::InitStatsForLevel().

◆ InitTamedPet()

bool Unit::InitTamedPet ( Pet pet,
uint8  level,
uint32  spell_id 
)
17468{
17469 Player* player = ToPlayer();
17470 PetStable& petStable = player->GetOrInitPetStable();
17471 if (petStable.CurrentPet || petStable.GetUnslottedHunterPet())
17472 return false;
17473
17474 pet->SetCreatorGUID(GetGUID());
17475 pet->SetFaction(GetFaction());
17476 pet->SetUInt32Value(UNIT_CREATED_BY_SPELL, spell_id);
17477
17478 if (IsPlayer())
17480
17481 if (!pet->InitStatsForLevel(level))
17482 {
17483 LOG_ERROR("entities.unit", "Pet::InitStatsForLevel() failed for creature (Entry: {})!", pet->GetEntry());
17484 return false;
17485 }
17486
17487 pet->GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
17488 // this enables pet details window (Shift+P)
17489 pet->InitPetCreateSpells();
17490 pet->SetFullHealth();
17491 pet->FillPetInfo(&petStable.CurrentPet.emplace());
17492 return true;
17493}
@ UNIT_CREATED_BY_SPELL
Definition UpdateFields.h:138
bool InitStatsForLevel(uint8 level)
Definition Pet.cpp:1018
Definition PetDefines.h:209
PetInfo const * GetUnslottedHunterPet() const
Definition PetDefines.h:237
Optional< PetInfo > CurrentPet
Definition PetDefines.h:232
void FillPetInfo(PetStable::PetInfo *petInfo) const
Definition Pet.cpp:2477
void InitPetCreateSpells()
Definition Pet.cpp:2052
PetStable & GetOrInitPetStable()
Definition Player.cpp:15558
void SetFullHealth()
Definition Unit.h:1049
void SetFaction(uint32 faction)
Definition Unit.cpp:10117
void ReplaceAllUnitFlags(UnitFlags flags)
Remove the Unit flag specify only.
Definition Unit.h:705
CharmInfo * GetCharmInfo()
Definition Unit.h:1208
void SetCreatorGUID(ObjectGuid creator)
Definition Unit.h:671
void SetPetNumber(uint32 petnumber, bool statwindow)
Definition CharmInfo.cpp:240

References PetStable::CurrentPet, Pet::FillPetInfo(), GetCharmInfo(), Object::GetEntry(), GetFaction(), Object::GetGUID(), Player::GetOrInitPetStable(), PetStable::GetUnslottedHunterPet(), Pet::InitPetCreateSpells(), Guardian::InitStatsForLevel(), Object::IsPlayer(), LOG_ERROR, ReplaceAllUnitFlags(), SetCreatorGUID(), SetFaction(), SetFullHealth(), CharmInfo::SetPetNumber(), SetUInt32Value(), sObjectMgr, Object::ToPlayer(), UNIT_CREATED_BY_SPELL, and UNIT_FLAG_PLAYER_CONTROLLED.

Referenced by CreateTamedPetFrom(), and CreateTamedPetFrom().

◆ InterruptNonMeleeSpells()

void Unit::InterruptNonMeleeSpells ( bool  withDelayed,
uint32  spellid = 0,
bool  withInstant = true,
bool  bySelf = false 
)
4177{
4178 // generic spells are interrupted if they are not finished or delayed
4179 if (m_currentSpells[CURRENT_GENERIC_SPELL] && (!spell_id || m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->Id == spell_id))
4180 InterruptSpell(CURRENT_GENERIC_SPELL, withDelayed, withInstant, bySelf);
4181
4182 // autorepeat spells are interrupted if they are not finished or delayed
4183 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL] && (!spell_id || m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id == spell_id))
4184 InterruptSpell(CURRENT_AUTOREPEAT_SPELL, withDelayed, withInstant, bySelf);
4185
4186 // channeled spells are interrupted if they are not finished, even if they are delayed
4187 if (m_currentSpells[CURRENT_CHANNELED_SPELL] && (!spell_id || m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->Id == spell_id))
4188 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4189}

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, InterruptSpell(), and m_currentSpells.

Referenced by _EnterVehicle(), PetAI::_stopAttack(), Player::ActivateSpec(), npc_dark_nucleus::npc_dark_nucleusAI::AttackStart(), CleanupBeforeRemoveFromMap(), CombatStop(), boss_julianne::DamageTaken(), boss_onyxia::DamageTaken(), boss_volazj::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_the_lich_king::boss_the_lich_kingAI::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DamageTaken(), DealDamage(), boss_leotheras_the_blind::DemonTime(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_akilzon::DoAction(), npc_medivh_bm::DoAction(), boss_thorim_sif::boss_thorim_sifAI::DoAction(), boss_nazan::DoAction(), npc_ranshalla::npc_ranshallaAI::DoContinueEscort(), Spell::EffectKnockBack(), boss_leotheras_the_blind::ElfTime(), boss_felblood_kaelthas::GravityLapseSequence(), spell_dk_death_grip::HandleBaseDummy(), WorldSession::HandleCancelCastOpcode(), spell_magtheridon_shadow_grasp::HandleDummyRemove(), spell_novos_crystal_handler_death_aura::HandleEffectApply(), spell_hydross_cleansing_field_command::HandleEffectRemove(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLootOpcode(), WorldSession::HandlePetActionHelper(), spell_the_lich_king_jump::HandleScript(), boss_shade_of_aran::JustEngagedWith(), npc_kilrek::JustEngagedWith(), boss_archimonde::JustEngagedWith(), boss_infinite_corruptor::boss_infinite_corruptorAI::JustEngagedWith(), boss_taldaram::JustEngagedWith(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::JustEngagedWith(), boss_urom::boss_uromAI::JustEngagedWith(), boss_thorim_runic_colossus::boss_thorim_runic_colossusAI::JustEngagedWith(), boss_kelidan_the_breaker::JustEngagedWith(), boss_curator::JustEngagedWith(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustEngagedWith(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustEngagedWith(), violet_hold_trashAI::JustEngagedWith(), PetAI::KilledUnit(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), boss_shade_of_aran::OnPowerUpdate(), boss_jeklik::PathEndReached(), npc_akama_illidan::PathEndReached(), PretendToDie(), boss_alar::PretendToDie(), SmartScript::ProcessAction(), RemoveAurasWithInterruptFlags(), boss_curator::Reset(), boss_malchezaar::Reset(), boss_varos::boss_varosAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), boss_talon_king_ikiss::Reset(), boss_high_astromancer_solarian::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), boss_illidan_stormrage::ScheduleAbilities(), boss_the_lurker_below::SchedulerPhaseOne(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), boss_anomalus::SetData(), setDeathState(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), boss_razorscale::boss_razorscaleAI::SpellHit(), StopAttackFaction(), Player::TeleportTo(), CasterAI::UpdateAI(), TotemAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_scholomance_occultist::npc_scholomance_occultistAI::UpdateAI(), boss_paletress::boss_paletressAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), npc_dark_nucleus::npc_dark_nucleusAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_hunter_snake_trap::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and PetAI::UpdateAI().

◆ InterruptSpell()

void Unit::InterruptSpell ( CurrentSpellTypes  spellType,
bool  withDelayed = true,
bool  withInstant = true,
bool  bySelf = false 
)
4108{
4109 //LOG_DEBUG("entities.unit", "Interrupt spell for unit {}.", GetEntry());
4110 Spell* spell = m_currentSpells[spellType];
4111 if (spell
4112 && (withDelayed || spell->getState() != SPELL_STATE_DELAYED)
4113 && (withInstant || spell->GetCastTime() > 0 || spell->getState() == SPELL_STATE_CASTING)) // xinef: or spell is in casting state (channeled spells only)
4114 {
4115 // for example, do not let self-stun aura interrupt itself
4116 if (!spell->IsInterruptable())
4117 return;
4118
4119 // send autorepeat cancel message for autorepeat spells
4120 if (spellType == CURRENT_AUTOREPEAT_SPELL)
4121 if (IsPlayer())
4123
4124 if (spell->getState() != SPELL_STATE_FINISHED)
4125 spell->cancel(bySelf);
4126 else
4127 {
4128 m_currentSpells[spellType] = nullptr;
4129 spell->SetReferencedFromCurrent(false);
4130 }
4131 }
4132}
@ SPELL_STATE_DELAYED
Definition Spell.h:231
void SendAutoRepeatCancel(Unit *target)
Definition PlayerMisc.cpp:152
bool IsInterruptable() const
Definition Spell.h:564
int32 GetCastTime() const
Definition Spell.h:550
uint32 getState() const
Definition Spell.h:485
void cancel(bool bySelf=false)
Definition Spell.cpp:3733

References Spell::cancel(), CURRENT_AUTOREPEAT_SPELL, Spell::GetCastTime(), Spell::getState(), Spell::IsInterruptable(), Object::IsPlayer(), m_currentSpells, Player::SendAutoRepeatCancel(), Spell::SetReferencedFromCurrent(), SPELL_STATE_CASTING, SPELL_STATE_DELAYED, SPELL_STATE_FINISHED, and Object::ToPlayer().

Referenced by _UpdateAutoRepeatSpell(), Player::ActivateTaxiPathTo(), Attack(), AttackStop(), CastStop(), Spell::EffectInterruptCast(), Spell::EffectSanctuary(), AuraEffect::HandleAuraModSilence(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandleCancelAutoRepeatSpellOpcode(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleCancelChanneling(), spell_hun_scatter_shot::HandleDummy(), AuraEffect::HandleFeignDeath(), InterruptNonMeleeSpells(), SmartAI::JustEngagedWith(), Player::RemoveItemDependentAurasAndCasts(), SetCurrentCastedSpell(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_nightbane::TriggerHealthTakeOff(), and npc_belnistrasz::npc_belnistraszAI::UpdateAI().

◆ InvalidateValuesUpdateCache()

void Unit::InvalidateValuesUpdateCache ( )
inlineprivate
2140{ _valuesUpdateCache.clear(); }

References _valuesUpdateCache.

Referenced by SetUInt32Value(), and Update().

◆ IsAlive()

bool Unit::IsAlive ( ) const
inline
1707{ return (m_deathState == DeathState::Alive); };

References Alive, and m_deathState.

Referenced by _CreateAuraApplication(), CreatureAI::_EnterEvadeMode(), _EnterVehicle(), _IsValidAssistTarget(), _IsValidAttackTarget(), Player::_LoadItem(), BossAI::_Reset(), WorldBossAI::_Reset(), KillRewarder::_RewardHonor(), KillRewarder::_RewardKillCredit(), KillRewarder::_RewardXP(), PetAI::_stopAttack(), AddAura(), Map::AddPlayerToMap(), HostileReference::AddThreat(), Spell::AddUnitTarget(), Attack(), PetAI::AttackedBy(), AttackerStateUpdate(), boss_freya::boss_freyaAI::boss_freyaAI(), boss_hodir::boss_hodirAI::boss_hodirAI(), boss_mimiron::boss_mimironAI::boss_mimironAI(), boss_thorim::boss_thorimAI::boss_thorimAI(), WorldSession::BuildPartyMemberStatsChangedPacket(), Player::BuyItemFromVendorSlot(), CalcAbsorbResist(), CalculateMeleeDamage(), CalculateSpellDamageTaken(), instance_ruins_of_ahnqiraj::instance_ruins_of_ahnqiraj_InstanceMapScript::CallNextRajaxxLeader(), Creature::CanAssistTo(), PetAI::CanAttack(), Player::CanCaptureTowerPoint(), CanHaveThreatList(), Player::CanInteractWithQuestGiver(), Player::CanUseAmmo(), Player::CanUseBattlegroundObject(), Player::CanUseItem(), Player::CastItemCombatSpell(), Player::CheckAreaExploreAndOutdoor(), spell_dk_raise_ally::CheckCast(), spell_hun_check_pet_los::CheckCast(), spell_hun_pet_heart_of_the_phoenix::CheckCast(), spell_hun_bestial_wrath::CheckCast(), Spell::CheckCast(), boss_gothik::boss_gothikAI::CheckGroupSplitted(), BattlegroundRV::CheckPositionForUnit(), spell_mage_focus_magic::CheckProc(), spell_dk_blood_caked_blade::CheckProc(), spell_dk_dancing_rune_weapon::CheckProc(), spell_item_necrotic_touch::CheckProc(), spell_pal_seal_of_righteousness::CheckProc(), spell_warl_siphon_life::CheckProc(), spell_putricide_mutation_init::CheckRequirementInternal(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CreatureUnitRelocationWorker(), DealDamage(), DealDamageMods(), DealMeleeDamage(), DealSpellDamage(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), Creature::DisappearAndDie(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_xerestrasza::npc_xerestraszaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_sister_svalna::boss_sister_svalnaAI::DoAction(), boss_high_king_maulgar::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_infinite_corruptor::boss_infinite_corruptorAI::DoAction(), boss_tharon_ja::boss_tharon_jaAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), Spell::DoAllEffectOnTarget(), spell_hun_masters_call::DoCheckCast(), RandomMovementGenerator< T >::DoInitialize(), WorldSession::DoLootRelease(), WaypointMovementGenerator< Creature >::DoUpdate(), instance_blackrock_spire::instance_blackrock_spireMapScript::Dragonspireroomcheck(), Spell::EffectAddExtraAttacks(), Spell::EffectEnergize(), Spell::EffectEnergizePct(), Spell::EffectEnvironmentalDMG(), Spell::EffectFeedPet(), Spell::EffectHeal(), Spell::EffectHealMaxHealth(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), Spell::EffectHealthLeech(), Spell::EffectInstaKill(), Spell::EffectInterruptCast(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectResurrect(), Spell::EffectResurrectNew(), Spell::EffectResurrectPet(), Spell::EffectSchoolDMG(), Spell::EffectScriptEffect(), Spell::EffectSelfResurrect(), Spell::EffectSkinPlayerCorpse(), Spell::EffectStuck(), Spell::EffectThreat(), Spell::EffectWeaponDmg(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), npc_tirion_fordring_tft::npc_tirion_fordringAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::EnterEvadeMode(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), npc_terenas_menethil::npc_terenas_menethilAI::EnterEvadeMode(), npc_pet_mage_mirror_image::EnterEvadeMode(), Player::EnvironmentalDamage(), Player::EquipItem(), BattleExperienceEvent::Execute(), ResetToHomeOrientation::Execute(), DelayedMovementEvent::Execute(), IceTombSummonEvent::Execute(), SACActivateEvent::Execute(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::ExecuteEvent(), AssistanceMovementGenerator::Finalize(), Creature::ForcedDespawn(), CreatureGroup::FormationReset(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::GetData(), GetDebugInfo(), Player::GetInitialVisiblePackets(), FollowerAI::GetLeaderForFollower(), Player::getMaxTimer(), CreatureGroup::GetNewTargetForMember(), Player::GetNPCIfCanInteractWith(), GetPartyMembers(), npc_air_force_bots::npc_air_force_botsAI::GetSummonedGuard(), npc_wild_wyrm::npc_wild_wyrmAI::GetValidPlayer(), Pet::GivePetXP(), Player::GiveXP(), go_wind_stone::go_wind_stoneAI::GossipSelect(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), BattlegroundEY::HandleAreaTrigger(), BattlegroundWS::HandleAreaTrigger(), WorldSession::HandleAreaTriggerOpcode(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModTotalThreat(), WorldSession::HandleAutostoreLootItemOpcode(), WorldSession::HandleBattleFieldPortOpcode(), misc_commandscript::HandleDamageCommand(), misc_commandscript::HandleDieCommand(), Player::HandleDrowning(), HandleDummyAuraProc(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), WorldSession::HandleEmoteOpcode(), Player::HandleFall(), misc_commandscript::HandleFreezeCommand(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleInitiateTradeOpcode(), WorldSession::HandleLootMoneyOpcode(), WorldSession::HandleMessagechatOpcode(), AuraEffect::HandleModTaunt(), AuraEffect::HandleModTotalPercentStat(), WorldSession::HandleMovementOpcodes(), npc_commandscript::HandleNpcMoveCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetWanderDistanceCommand(), AuraEffect::HandleObsModPowerAuraTick(), WorldSession::HandleOpenItemOpcode(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), WorldSession::HandlePetAction(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandlePetStopAttack(), misc_commandscript::HandlePInfoCommand(), spell_pal_seal_of_command_aura::HandleProc(), HandleProcTriggerSpell(), WorldSession::HandleReclaimCorpseOpcode(), WorldSession::HandleRepopRequestOpcode(), WorldSession::HandleRequestPartyMemberStatsOpcode(), ArenaSpectator::HandleResetCommand(), WorldSession::HandleSetAmmoOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), misc_commandscript::HandleSkirmishCommand(), ArenaSpectator::HandleSpectatorSpectateCommand(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleSummonResponseOpcode(), WorldSession::HandleUnstablePet(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), boss_moroes::InitializeGuests(), Player::IsAtGroupRewardDistance(), Player::IsAtRecruitAFriendDistance(), Creature::IsInvisibleDueToDespawn(), Player::IsOutdoorPvPActive(), Player::IsPetNeedBeTemporaryUnsummoned(), isTargetableForAttack(), IsValidCombatTarget(), Spell::IsValidDeadOrAliveTarget(), ThreatCalcHelper::isValidProcess(), npc_kilrek::JustDied(), boss_rajaxx::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), boss_freya::boss_freyaAI::JustEngagedWith(), npc_underbat::JustEngagedWith(), boss_sartharion::boss_sartharionAI::JustEngagedWith(), boss_fathomlord_karathress::JustReachedHome(), boss_rotface::boss_rotfaceAI::JustSummoned(), Kill(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), CreatureGroup::LeaderMoveTo(), Player::LoadCorpse(), GridObjectLoader::LoadCreatures(), Player::LoadFromDB(), MagicSpellHitResult(), AchievementCriteriaData::Meets(), CreatureGroup::MemberEngagingTarget(), CreatureGroup::MemberEvaded(), npc_twiggy_flathead::npc_twiggy_flatheadAI::MoveInLineOfSight(), boss_lord_marrowgar::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_uldaman::instance_uldaman_InstanceMapScript::OnCreatureCreate(), instance_temple_of_ahnqiraj::instance_temple_of_ahnqiraj_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), instance_shadow_labyrinth::instance_shadow_labyrinth_InstanceMapScript::OnCreatureCreate(), go_palehoof_sphere::OnGossipHello(), go_jotunheim_cage::OnGossipHello(), go_dragonflayer_cage::OnGossipHello(), spell_yogg_saron_brain_link_aura::OnPeriodic(), instance_violet_hold::instance_violet_hold_InstanceMapScript::OnPlayerEnter(), instance_eye_of_eternity::instance_eye_of_eternity_InstanceMapScript::OnPlayerEnter(), at_orb_of_command::OnTrigger(), at_ancient_leaf::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_celestial_planetarium_enterance::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), AreaTrigger_at_nats_landing::OnTrigger(), AreaTrigger_at_sentry_point::OnTrigger(), SmartTrigger::OnTrigger(), AreaTrigger_at_area_52_entrance::OnTrigger(), at_dragonspire_hall::OnTrigger(), at_blackrock_stadium::OnTrigger(), near_scarshield_infiltrator::OnTrigger(), at_scarshield_infiltrator::OnTrigger(), at_commander_dawnforge::OnTrigger(), RisenArchmageCheck::operator()(), WretchedGhoulCleaner::operator()(), ValithriaDespawner::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::NearestCreatureEntryWithLiveStateInObjectRangeCheck::operator()(), Acore::PlayerAtMinimumRangeAway::operator()(), Acore::AnyDeadUnitObjectInRangeCheck::operator()(), Acore::AnyPlayerInObjectRangeCheck::operator()(), Acore::NearestPlayerInObjectRangeCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::AnyUnitInObjectRangeCheck::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), Acore::AnyDeadUnitCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::MostHPMissingGroupInRange::operator()(), FrostwingVrykulSearcher::operator()(), Acore::AllDeadCreaturesInRange::operator()(), ShadowTrapLKTargetSelector::operator()(), NonTankLKTargetSelector::operator()(), DefileTargetSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), PetAI::OwnerAttacked(), npc_pet_gen_valkyr_guardian::OwnerAttacked(), PetAI::OwnerAttackedBy(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), MapMgr::PlayerCannotEnter(), ProcDamageAndSpell(), SmartScript::ProcessAction(), RemoveCharmedBy(), Group::RemoveMember(), Player::RemovePet(), Battleground::RemovePlayerAtLeave(), Player::RepopAtGraveyard(), boss_kiljaeden::Reset(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::Reset(), boss_fathomlord_karathress::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), Creature::Respawn(), Player::RewardPlayerAndGroupAtEvent(), BossAI::ScheduleEnrageTimer(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), Player::SendLoot(), npc_corrupted_totem::SetAura(), instance_naxxramas::SetBossState(), SetConfused(), boss_emperor_dagran_thaurissan::boss_draganthaurissanAI::SetData(), instance_scarlet_monastery::instance_scarlet_monastery_InstanceMapScript::SetData(), npc_enslaved_proto_drake::SetData(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::SetData(), boss_teron_gorefiend::SetData(), Player::setDeathState(), Creature::SetDisableGravity(), SetFeared(), Creature::SetHover(), SetInCombatState(), SetStunned(), Battlefield::ShowNpc(), npc_dark_iron_guzzler::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_hor_lich_king::npc_hor_lich_kingAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), WaypointMovementGenerator< Creature >::StartMove(), PassengerController::SummonCreatures(), boss_rend_blackhand::boss_rend_blackhandAI::SummonedCreatureDespawn(), boss_priestess_delrissa::SummonedCreatureDies(), Player::SwapItem(), lfg::LFGMgr::TeleportPlayer(), BattlegroundRV::TeleportUnitToNewZ(), Pet::Update(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Puppet::Update(), Player::Update(), Totem::Update(), Update(), TimedFleeingMovementGenerator::Update(), TotemAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_dark_iron_guzzler::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_gormok::boss_gormokAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_ice_tomb::npc_ice_tombAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::UpdateAI(), boss_vezax::boss_vezaxAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_erekem::boss_erekemAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), PetAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), npc_tooga::npc_toogaAI::UpdateFollowerAI(), npc_ringo::npc_ringoAI::UpdateFollowerAI(), InstanceScript::UpdateMinionState(), Creature::UpdateMovementFlags(), boss_netherspite::UpdatePortals(), boss_twin_valkyrAI::UpdateSharedHealth(), UpdateSplineMovement(), Player::UpdateZone(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsAlwaysDetectableFor()

bool Unit::IsAlwaysDetectableFor ( WorldObject const *  seer) const
overrideprotectedvirtual

Reimplemented from WorldObject.

14305{
14307 return true;
14308
14309 if (HasAuraTypeWithCaster(SPELL_AURA_MOD_STALKED, seer->GetGUID()))
14310 return true;
14311
14312 if (Player* ownerPlayer = GetSpellModOwner())
14313 if (Player const* seerPlayer = seer->ToPlayer())
14314 {
14315 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14316 return true;
14317 }
14318
14319 return false;
14320}
@ SPELL_AURA_MOD_STALKED
Definition SpellAuraDefines.h:131
virtual bool IsAlwaysDetectableFor(WorldObject const *) const
Definition Object.h:724

References Object::GetGUID(), GetSpellModOwner(), HasAuraTypeWithCaster(), WorldObject::IsAlwaysDetectableFor(), SPELL_AURA_MOD_STALKED, and Object::ToPlayer().

Referenced by Creature::IsAlwaysDetectableFor(), and Player::IsAlwaysDetectableFor().

◆ IsAlwaysVisibleFor()

bool Unit::IsAlwaysVisibleFor ( WorldObject const *  seer) const
overrideprotectedvirtual

: Check if unit is eligible for sparring damages. Work only if attacker and victim are creatures.

Reimplemented from WorldObject.

14286{
14288 return true;
14289
14290 // Always seen by owner
14291 if (ObjectGuid guid = GetCharmerOrOwnerGUID())
14292 if (seer->GetGUID() == guid)
14293 return true;
14294
14295 if (Player const* seerPlayer = seer->ToPlayer())
14296 if (Unit* owner = GetOwner())
14297 if (Player* ownerPlayer = owner->ToPlayer())
14298 if (ownerPlayer->IsGroupVisibleFor(seerPlayer))
14299 return true;
14300
14301 return false;
14302}
virtual bool IsAlwaysVisibleFor(WorldObject const *) const
Definition Object.h:721

References GetCharmerOrOwnerGUID(), Object::GetGUID(), GetOwner(), WorldObject::IsAlwaysVisibleFor(), and Object::ToPlayer().

◆ IsArmorer()

bool Unit::IsArmorer ( ) const
inline
@ UNIT_NPC_FLAG_REPAIR
Definition UnitDefines.h:327
bool HasNpcFlag(NPCFlags flags) const
Definition Unit.h:718

References HasNpcFlag(), and UNIT_NPC_FLAG_REPAIR.

◆ isAttackingPlayer()

bool Unit::isAttackingPlayer ( ) const
10549{
10551 return true;
10552
10553 if (!m_Controlled.empty())
10554 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10555 if ((*itr)->isAttackingPlayer())
10556 return true;
10557
10558 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
10559 if (m_SummonSlot[i])
10560 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
10561 if (summon->isAttackingPlayer())
10562 return true;
10563
10564 return false;
10565}
Creature * GetCreature(ObjectGuid const guid)
Definition Map.cpp:2389

References Map::GetCreature(), WorldObject::GetMap(), HasUnitState(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, and UNIT_STATE_ATTACK_PLAYER.

◆ isAttackReady()

◆ IsAttackSpeedOverridenShapeShift()

bool Unit::IsAttackSpeedOverridenShapeShift ( ) const
19334{
19335 // Mirroring clientside gameplay logic
19336 if (ShapeshiftForm form = GetShapeshiftForm())
19337 if (SpellShapeshiftFormEntry const* entry = sSpellShapeshiftFormStore.LookupEntry(form))
19338 return entry->attackSpeed > 0;
19339
19340 return false;
19341}

References GetShapeshiftForm(), and sSpellShapeshiftFormStore.

Referenced by Player::CalculateMinMaxDamage().

◆ IsAuctioner()

bool Unit::IsAuctioner ( ) const
inline
@ UNIT_NPC_FLAG_AUCTIONEER
Definition UnitDefines.h:336

References HasNpcFlag(), and UNIT_NPC_FLAG_AUCTIONEER.

◆ IsBanker()

bool Unit::IsBanker ( ) const
inline
@ UNIT_NPC_FLAG_BANKER
Definition UnitDefines.h:332

References HasNpcFlag(), and UNIT_NPC_FLAG_BANKER.

◆ IsBattleMaster()

bool Unit::IsBattleMaster ( ) const
inline

◆ isBeingLoaded()

virtual bool Unit::isBeingLoaded ( ) const
inlinevirtual

Reimplemented in Pet, and Player.

657{ return false;}

Referenced by Player::SetMover().

◆ isBlockCritical()

bool Unit::isBlockCritical ( )
3155{
3157 return true;
3158 return false;
3159}
@ SPELL_AURA_MOD_BLOCK_CRIT_CHANCE
Definition SpellAuraDefines.h:316

References GetTotalAuraModifier(), roll_chance_i(), and SPELL_AURA_MOD_BLOCK_CRIT_CHANCE.

Referenced by CalculateMeleeDamage(), and CalculateSpellDamageTaken().

◆ IsCharmed()

◆ IsCharmedOwnedByPlayerOrPlayer()

bool Unit::IsCharmedOwnedByPlayerOrPlayer ( ) const
inline

◆ IsClass()

◆ IsContestedGuard()

bool Unit::IsContestedGuard ( ) const
inline
969 {
971 return entry->IsContestedGuardFaction();
972
973 return false;
974 }

References GetFactionTemplateEntry().

Referenced by Acore::NearestVisibleDetectableContestedGuardUnitCheck::operator()().

◆ IsControllableGuardian()

bool Unit::IsControllableGuardian ( ) const
inline

◆ IsControlledByPlayer()

◆ IsCreatedByPlayer()

bool Unit::IsCreatedByPlayer ( ) const
inline
1235{ return m_CreatedByPlayer; }

References m_CreatedByPlayer.

Referenced by DealDamage().

◆ IsCritter()

◆ IsDamageReducedByArmor()

bool Unit::IsDamageReducedByArmor ( SpellSchoolMask  damageSchoolMask,
SpellInfo const *  spellInfo = nullptr,
uint8  effIndex = MAX_SPELL_EFFECTS 
)
static
2035{
2036 // only physical spells damage gets reduced by armor
2037 if ((schoolMask & SPELL_SCHOOL_MASK_NORMAL) == 0)
2038 return false;
2039 if (spellInfo)
2040 {
2041 // there are spells with no specific attribute but they have "ignores armor" in tooltip
2042 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_IGNORE_ARMOR))
2043 return false;
2044
2045 // bleeding effects are not reduced by armor
2046 if (effIndex != MAX_SPELL_EFFECTS)
2047 {
2048 if (spellInfo->Effects[effIndex].ApplyAuraName == SPELL_AURA_PERIODIC_DAMAGE ||
2049 spellInfo->Effects[effIndex].Effect == SPELL_EFFECT_SCHOOL_DAMAGE)
2050 if (spellInfo->GetEffectMechanicMask(effIndex) & (1 << MECHANIC_BLEED))
2051 return false;
2052 }
2053 }
2054 return true;
2055}
@ MECHANIC_BLEED
Definition SharedDefines.h:1340
@ SPELL_ATTR0_CU_IGNORE_ARMOR
Definition SpellInfo.h:191

References SpellInfo::Effects, SpellInfo::GetEffectMechanicMask(), SpellInfo::HasAttribute(), MAX_SPELL_EFFECTS, MECHANIC_BLEED, SPELL_ATTR0_CU_IGNORE_ARMOR, SPELL_AURA_PERIODIC_DAMAGE, SPELL_EFFECT_SCHOOL_DAMAGE, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by CalculateMeleeDamage(), CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ isDead()

bool Unit::isDead ( ) const
inline

References Corpse, Dead, and m_deathState.

Referenced by npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::CheckEventFail(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraDummy(), Player::HandleFall(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), misc_commandscript::HandleRespawnCommand(), spell_prince_taldaram_conjure_flame_sphere::HandleScript(), Creature::HasSpellFocus(), UnitAI::InitializeAI(), SmartAI::InitializeAI(), npc_troll_volunteer::npc_troll_volunteerAI::InitializeAI(), npc_spinestalker::npc_spinestalkerAI::InitializeAI(), npc_rimefang::npc_rimefangAI::InitializeAI(), npc_sindragosa_trash::npc_sindragosa_trashAI::InitializeAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), Player::isAllowedToLoot(), npc_anubisath_sentinel::aqsentinelAI::JustDied(), Player::OnGossipSelect(), AreaTrigger_at_stormwright_shelf::OnTrigger(), AreaTrigger_at_scent_larkorwi::OnTrigger(), at_bring_your_orphan_to::OnTrigger(), Player::PrepareGossipMenu(), SmartScript::ProcessAction(), Player::RepopAtGraveyard(), npc_anubisath_sentinel::aqsentinelAI::Reset(), WorldSession::SendAttackStop(), SendMeleeAttackStop(), instance_molten_core::instance_molten_core_InstanceMapScript::SetBossState(), and npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI().

◆ IsDuringRemoveFromWorld()

◆ isDying()

bool Unit::isDying ( ) const
inline
1708{ return (m_deathState == DeathState::JustDied); };

References JustDied, and m_deathState.

Referenced by Creature::IsInvisibleDueToDespawn(), and SetHover().

◆ IsEngaged()

◆ IsEngagedBy()

bool Unit::IsEngagedBy ( Unit const *  who) const
inline

◆ IsFalling()

◆ IsFFAPvP()

bool Unit::IsFFAPvP ( ) const
inline

◆ IsFlying()

◆ IsFriendlyTo()

bool Unit::IsFriendlyTo ( Unit const *  unit) const
10303{
10304 return GetReactionTo(unit) >= REP_FRIENDLY;
10305}

References GetReactionTo(), and REP_FRIENDLY.

Referenced by Spell::_cast(), AuraApplication::_InitFlags(), Creature::_IsTargetAcceptable(), FollowerAI::AssistPlayerInCombatAgainst(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::AttackedBy(), Creature::CanAssistTo(), spell_dk_death_coil::CheckCast(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), Spell::CheckCast(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), Spell::EffectDispel(), Spell::EffectDispelMechanic(), Spell::EffectStealBeneficialBuff(), Spell::EffectThreat(), Aura::HandleAuraSpecificMods(), spell_dk_death_coil::HandleDummy(), spell_pal_holy_shock::HandleDummy(), spell_pri_penance::HandleDummy(), HandleDummyAuraProc(), BattlefieldWG::HandleKill(), spell_winter_veil_shoot_air_rifle::HandleScriptEffect(), WorldSession::HandleSetSelectionOpcode(), Spell::HandleThreatSpells(), GameObject::IsAlwaysVisibleFor(), SpellClickInfo::IsFitToRequirements(), npc_draenei_survivor::npc_draenei_survivorAI::MoveInLineOfSight(), Acore::AnyUnfriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyUnitInObjectRangeCheck::operator()(), Acore::AnyFriendlyNotSelfUnitInObjectRangeCheck::operator()(), Acore::AllFriendlyCreaturesInGrid::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), PetSpellFail(), SmartScript::ProcessEvent(), RemoveCharmedBy(), Spell::SelectExplicitTargets(), Player::SendLoot(), Acore::MessageDistDelivererToHostile::SendPacket(), and TotemAI::UpdateAI().

◆ isFrozen()

◆ IsFullHealth()

◆ IsGossip()

bool Unit::IsGossip ( ) const
inline
@ UNIT_NPC_FLAG_GOSSIP
Definition UnitDefines.h:315

References HasNpcFlag(), and UNIT_NPC_FLAG_GOSSIP.

◆ IsGuardian()

◆ IsGuildMaster()

bool Unit::IsGuildMaster ( ) const
inline
@ UNIT_NPC_FLAG_PETITIONER
Definition UnitDefines.h:333

References HasNpcFlag(), and UNIT_NPC_FLAG_PETITIONER.

◆ IsHostileTo()

◆ IsHostileToPlayers()

bool Unit::IsHostileToPlayers ( ) const
10308{
10309 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10310 if (!my_faction || !my_faction->faction)
10311 return false;
10312
10313 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10314 if (raw_faction && raw_faction->reputationListID >= 0)
10315 return false;
10316
10317 return my_faction->IsHostileToPlayers();
10318}
int32 reputationListID
Definition DBCStructure.h:909
uint32 faction
Definition DBCStructure.h:941
bool IsHostileToPlayers() const
Definition DBCStructure.h:981

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsHostileToPlayers(), FactionEntry::reputationListID, and sFactionStore.

◆ IsHovering()

◆ IsHunterPet()

◆ IsImmunedToDamage() [1/3]

bool Unit::IsImmunedToDamage ( Spell const *  spell) const
12879{
12880 SpellInfo const* spellInfo = spell->GetSpellInfo();
12881 if (!spellInfo)
12882 {
12883 return false;
12884 }
12885
12887 {
12888 return false;
12889 }
12890
12892 {
12893 return false;
12894 }
12895
12896 uint32 schoolMask = spell->GetSpellSchoolMask();
12897 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12898 {
12899 return false;
12900 }
12901
12902 // If m_immuneToDamage type contain magic, IMMUNE damage.
12903 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12904 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12905 {
12906 if ((itr->type & schoolMask) == schoolMask)
12907 {
12908 return true;
12909 }
12910 }
12911
12912 return false;
12913}
@ SPELL_ATTR2_NO_SCHOOL_IMMUNITIES
Definition SharedDefines.h:482
@ SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS
Definition SharedDefines.h:435
@ IMMUNITY_DAMAGE
Definition SharedDefines.h:1397
@ SPELL_SCHOOL_MASK_NONE
Definition SharedDefines.h:296
std::vector< SpellImmune > SpellImmuneList
Definition SpellDefines.h:182

References Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [2/3]

bool Unit::IsImmunedToDamage ( SpellInfo const *  spellInfo) const
12847{
12848 if (!spellInfo)
12849 {
12850 return false;
12851 }
12852
12853 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12854 {
12855 return false;
12856 }
12857
12858 if (spellInfo->HasAttribute(SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS) || spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
12859 {
12860 return false;
12861 }
12862
12863 uint32 schoolMask = spellInfo->GetSchoolMask();
12864 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12865 {
12866 return false;
12867 }
12868
12869 // If m_immuneToDamage type contain magic, IMMUNE damage.
12870 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12871 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12872 if ((itr->type & schoolMask) == schoolMask)
12873 return true;
12874
12875 return false;
12876}

References SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_DAMAGE, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR1_IMMUNITY_TO_HOSTILE_AND_FRIENDLY_EFFECTS, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, and SPELL_SCHOOL_MASK_NONE.

◆ IsImmunedToDamage() [3/3]

bool Unit::IsImmunedToDamage ( SpellSchoolMask  meleeSchoolMask) const
12831{
12832 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12833 {
12834 return false;
12835 }
12836
12837 // If m_immuneToDamage type contain magic, IMMUNE damage.
12838 SpellImmuneList const& damageList = m_spellImmune[IMMUNITY_DAMAGE];
12839 for (SpellImmuneList::const_iterator itr = damageList.begin(); itr != damageList.end(); ++itr)
12840 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12841 return true;
12842
12843 return false;
12844}

References IMMUNITY_DAMAGE, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by boss_gurtogg_bloodboil::CanAIAttack(), Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), and IsImmunedToDamageOrSchool().

◆ IsImmunedToDamageOrSchool() [1/2]

bool Unit::IsImmunedToDamageOrSchool ( SpellInfo const *  spellInfo) const
12995{
12996 return IsImmunedToDamage(spellInfo) || IsImmunedToSchool(spellInfo);
12997}
bool IsImmunedToSchool(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12915
bool IsImmunedToDamage(SpellSchoolMask meleeSchoolMask) const
Definition Unit.cpp:12830

References IsImmunedToDamage(), and IsImmunedToSchool().

◆ IsImmunedToDamageOrSchool() [2/2]

◆ IsImmunedToSchool() [1/3]

bool Unit::IsImmunedToSchool ( Spell const *  spell) const
12955{
12956 SpellInfo const* spellInfo = spell->GetSpellInfo();
12958 {
12959 return false;
12960 }
12961
12962 uint32 schoolMask = spell->GetSpellSchoolMask();
12963 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12964 {
12965 return false;
12966 }
12967
12968 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12969 {
12970 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12971 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12972 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12973 {
12974 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12975 {
12976 return true;
12977 }
12978 }
12979 }
12980
12981 return false;
12982}
@ IMMUNITY_SCHOOL
Definition SharedDefines.h:1396
bool CanPierceImmuneAura(SpellInfo const *aura) const
Definition SpellInfo.cpp:1323

References SpellInfo::CanPierceImmuneAura(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [2/3]

bool Unit::IsImmunedToSchool ( SpellInfo const *  spellInfo) const
12932{
12933 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
12934 return false;
12935
12936 uint32 schoolMask = spellInfo->GetSchoolMask();
12937 if (schoolMask == SPELL_SCHOOL_MASK_NONE)
12938 {
12939 return false;
12940 }
12941
12942 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
12943 {
12944 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12945 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12946 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12947 if ((itr->type & schoolMask) == schoolMask && !spellInfo->CanPierceImmuneAura(sSpellMgr->GetSpellInfo(itr->spellId)))
12948 return true;
12949 }
12950
12951 return false;
12952}

References SpellInfo::CanPierceImmuneAura(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_SCHOOL, m_spellImmune, SPELL_ATTR0_NO_IMMUNITIES, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

◆ IsImmunedToSchool() [3/3]

bool Unit::IsImmunedToSchool ( SpellSchoolMask  meleeSchoolMask) const
12916{
12917 if (meleeSchoolMask == SPELL_SCHOOL_MASK_NONE)
12918 {
12919 return false;
12920 }
12921
12922 // If m_immuneToSchool type contain this school type, IMMUNE damage.
12923 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
12924 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
12925 if ((itr->type & meleeSchoolMask) == meleeSchoolMask)
12926 return true;
12927
12928 return false;
12929}

References IMMUNITY_SCHOOL, m_spellImmune, and SPELL_SCHOOL_MASK_NONE.

Referenced by Spell::DoSpellHitOnUnit(), IsImmunedToDamageOrSchool(), IsImmunedToDamageOrSchool(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpell()

bool Unit::IsImmunedToSpell ( SpellInfo const *  spellInfo,
Spell const *  spell = nullptr 
)
virtual

Reimplemented in Creature.

13000{
13001 if (!spellInfo)
13002 return false;
13003
13004 // Single spell immunity.
13005 SpellImmuneList const& idList = m_spellImmune[IMMUNITY_ID];
13006 for (SpellImmuneList::const_iterator itr = idList.begin(); itr != idList.end(); ++itr)
13007 if (itr->type == spellInfo->Id)
13008 return true;
13009
13010 // xinef: my special immunity, if spellid is not on this list it means npc is immune
13011 SpellImmuneList const& allowIdList = m_spellImmune[IMMUNITY_ALLOW_ID];
13012 if (!allowIdList.empty())
13013 {
13014 for (SpellImmuneList::const_iterator itr = allowIdList.begin(); itr != allowIdList.end(); ++itr)
13015 if (itr->type == spellInfo->Id)
13016 return false;
13017 return true;
13018 }
13019
13020 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13021 return false;
13022
13023 if (spellInfo->Dispel)
13024 {
13025 SpellImmuneList const& dispelList = m_spellImmune[IMMUNITY_DISPEL];
13026 for (SpellImmuneList::const_iterator itr = dispelList.begin(); itr != dispelList.end(); ++itr)
13027 if (itr->type == spellInfo->Dispel)
13028 return true;
13029 }
13030
13031 // Spells that don't have effectMechanics.
13032 if (spellInfo->Mechanic)
13033 {
13034 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13035 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13036 if (itr->type == spellInfo->Mechanic)
13037 return true;
13038 }
13039
13040 bool immuneToAllEffects = true;
13041 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13042 {
13043 // State/effect immunities applied by aura expect full spell immunity
13044 // Ignore effects with mechanic, they are supposed to be checked separately
13045 if (!spellInfo->Effects[i].IsEffect())
13046 continue;
13047
13048 // Xinef: if target is immune to one effect, and the spell has transform aura - it is immune to whole spell
13049 if (IsImmunedToSpellEffect(spellInfo, i))
13050 {
13051 if (spellInfo->HasAura(SPELL_AURA_TRANSFORM))
13052 return true;
13053 continue;
13054 }
13055
13056 immuneToAllEffects = false;
13057 break;
13058 }
13059 if (immuneToAllEffects) //Return immune only if the target is immune to all spell effects.
13060 return true;
13061
13062 if (spellInfo->Id != 42292 && spellInfo->Id != 59752 && spellInfo->Id != 19574 && spellInfo->Id != 34471)
13063 {
13064 SpellSchoolMask spellSchoolMask = spellInfo->GetSchoolMask();
13065 if (spell)
13066 {
13067 spellSchoolMask = spell->GetSpellSchoolMask();
13068 }
13069
13070 if (spellSchoolMask != SPELL_SCHOOL_MASK_NONE)
13071 {
13072 SpellImmuneList const& schoolList = m_spellImmune[IMMUNITY_SCHOOL];
13073 for (SpellImmuneList::const_iterator itr = schoolList.begin(); itr != schoolList.end(); ++itr)
13074 {
13075 SpellInfo const* immuneSpellInfo = sSpellMgr->GetSpellInfo(itr->spellId);
13076 if (((itr->type & spellSchoolMask) == spellSchoolMask)
13077 && (!immuneSpellInfo || immuneSpellInfo->IsPositive()) && !spellInfo->IsPositive()
13078 && !spellInfo->CanPierceImmuneAura(immuneSpellInfo))
13079 {
13080 return true;
13081 }
13082 }
13083 }
13084 }
13085
13086 return false;
13087}
@ IMMUNITY_ALLOW_ID
Definition SharedDefines.h:1401
@ IMMUNITY_ID
Definition SharedDefines.h:1400
@ IMMUNITY_MECHANIC
Definition SharedDefines.h:1399

References SpellInfo::CanPierceImmuneAura(), SpellInfo::Dispel, SpellInfo::Effects, SpellInfo::GetSchoolMask(), Spell::GetSpellSchoolMask(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpiritOfRedemptionAura(), SpellInfo::Id, IMMUNITY_ALLOW_ID, IMMUNITY_DISPEL, IMMUNITY_ID, IMMUNITY_MECHANIC, IMMUNITY_SCHOOL, IsImmunedToSpellEffect(), SpellInfo::IsPositive(), m_spellImmune, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_TRANSFORM, SPELL_SCHOOL_MASK_NONE, and sSpellMgr.

Referenced by AddAura(), Spell::DoSpellHitOnUnit(), Creature::IsImmunedToSpell(), spell_hun_lock_and_load::IsTargetValid(), boss_talon_king_ikiss::JustEngagedWith(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), SpellHitResult(), and SpellHitResult().

◆ IsImmunedToSpellEffect()

bool Unit::IsImmunedToSpellEffect ( SpellInfo const *  spellInfo,
uint32  index 
) const
virtual

Reimplemented in Creature, and Totem.

13090{
13091 if (!spellInfo || !spellInfo->Effects[index].IsEffect())
13092 return false;
13093
13094 // xinef: pet scaling auras
13095 if (spellInfo->HasAttribute(SPELL_ATTR4_OWNER_POWER_SCALING))
13096 return false;
13097
13098 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) && !HasSpiritOfRedemptionAura())
13099 return false;
13100
13101 //If m_immuneToEffect type contain this effect type, IMMUNE effect.
13102 uint32 effect = spellInfo->Effects[index].Effect;
13103 SpellImmuneList const& effectList = m_spellImmune[IMMUNITY_EFFECT];
13104 for (SpellImmuneList::const_iterator itr = effectList.begin(); itr != effectList.end(); ++itr)
13105 {
13106 if (itr->type == effect && (itr->spellId != 62692 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13107 {
13108 return true;
13109 }
13110 }
13111
13112 if (uint32 mechanic = spellInfo->Effects[index].Mechanic)
13113 {
13114 SpellImmuneList const& mechanicList = m_spellImmune[IMMUNITY_MECHANIC];
13115 for (SpellImmuneList::const_iterator itr = mechanicList.begin(); itr != mechanicList.end(); ++itr)
13116 if (itr->type == mechanic)
13117 return true;
13118 }
13119
13120 if (uint32 aura = spellInfo->Effects[index].ApplyAuraName)
13121 {
13123 for (SpellImmuneList::const_iterator itr = list.begin(); itr != list.end(); ++itr)
13124 {
13125 if (itr->type == aura && (itr->spellId != 64848 || (spellInfo->Effects[index].MiscValue == POWER_MANA && !CanRestoreMana(spellInfo))))
13126 {
13127 if (!spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
13128 {
13129 if (itr->blockType == SPELL_BLOCK_TYPE_ALL || spellInfo->IsPositive()) // xinef: added for pet scaling
13130 {
13131 return true;
13132 }
13133 }
13134 }
13135 }
13136
13137 if (!spellInfo->HasAttribute(SPELL_ATTR2_NO_SCHOOL_IMMUNITIES))
13138 {
13139 // Check for immune to application of harmful magical effects
13141 for (AuraEffectList::const_iterator iter = immuneAuraApply.begin(); iter != immuneAuraApply.end(); ++iter)
13142 {
13143 if (/*(spellInfo->Dispel == DISPEL_MAGIC || spellInfo->Dispel == DISPEL_CURSE || spellInfo->Dispel == DISPEL_DISEASE) &&*/ // Magic debuff, xinef: all kinds?
13144 ((*iter)->GetMiscValue() & spellInfo->GetSchoolMask()) && // Check school
13145 !spellInfo->IsPositiveEffect(index) && // Harmful
13146 spellInfo->Effects[index].Effect != SPELL_EFFECT_PERSISTENT_AREA_AURA) // Not Persistent area auras
13147 {
13148 return true;
13149 }
13150 }
13151 }
13152 }
13153
13154 return false;
13155}
@ SPELL_EFFECT_PERSISTENT_AREA_AURA
Definition SharedDefines.h:805
@ SPELL_ATTR3_ALWAYS_HIT
Definition SharedDefines.h:511
@ IMMUNITY_STATE
Definition SharedDefines.h:1395
@ IMMUNITY_EFFECT
Definition SharedDefines.h:1394
@ SPELL_ATTR4_OWNER_POWER_SCALING
Definition SharedDefines.h:555
@ SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL
Definition SpellAuraDefines.h:330
@ SPELL_BLOCK_TYPE_ALL
Definition SpellDefines.h:159
bool CanRestoreMana(SpellInfo const *spellInfo) const
Definition Unit.cpp:21089

References CanRestoreMana(), SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasSpiritOfRedemptionAura(), IMMUNITY_EFFECT, IMMUNITY_MECHANIC, IMMUNITY_STATE, SpellInfo::IsPositive(), SpellInfo::IsPositiveEffect(), m_spellImmune, POWER_MANA, SPELL_ATTR0_NO_IMMUNITIES, SPELL_ATTR2_NO_SCHOOL_IMMUNITIES, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_OWNER_POWER_SCALING, SPELL_AURA_MOD_IMMUNE_AURA_APPLY_SCHOOL, SPELL_BLOCK_TYPE_ALL, and SPELL_EFFECT_PERSISTENT_AREA_AURA.

Referenced by AddAura(), Spell::AddUnitTarget(), Spell::DoSpellHitOnUnit(), spell_dk_death_grip::HandleBaseDummy(), IsImmunedToSpell(), and Creature::IsImmunedToSpellEffect().

◆ IsImmuneToAll()

bool Unit::IsImmuneToAll ( ) const
inline
870{ return IsImmuneToPC() && IsImmuneToNPC(); }

References IsImmuneToNPC(), and IsImmuneToPC().

◆ IsImmuneToNPC()

◆ IsImmuneToPC()

◆ isInAccessiblePlaceFor()

bool Unit::isInAccessiblePlaceFor ( Creature const *  c) const
4250{
4251 if (c->GetMapId() == MAP_THE_RING_OF_VALOR)
4252 {
4253 // skip transport check, check for being below floor level
4254 if (this->GetPositionZ() < 28.0f)
4255 return false;
4256 if (BattlegroundMap* bgMap = c->GetMap()->ToBattlegroundMap())
4257 if (Battleground* bg = bgMap->GetBG())
4258 if (bg->GetStartTime() < 80133) // 60000ms preparation time + 20133ms elevator rise time
4259 return false;
4260 }
4261 else if (c->GetMapId() == MAP_ICECROWN_CITADEL)
4262 {
4263 // if static transport doesn't match - return false
4264 if (c->GetTransport() != this->GetTransport() && ((c->GetTransport() && c->GetTransport()->IsStaticTransport()) || (this->GetTransport() && this->GetTransport()->IsStaticTransport())))
4265 return false;
4266
4267 // special handling for ICC (map 631), for non-flying pets in Gunship Battle, for trash npcs this is done via CanAIAttack
4268 if (c->GetOwnerGUID().IsPlayer() && !c->CanFly())
4269 {
4270 if (c->GetTransport() != this->GetTransport())
4271 return false;
4272 if (this->GetTransport())
4273 {
4274 if (c->GetPositionY() < 2033.0f)
4275 {
4276 if (this->GetPositionY() > 2033.0f)
4277 return false;
4278 }
4279 else if (c->GetPositionY() < 2438.0f)
4280 {
4281 if (this->GetPositionY() < 2033.0f || this->GetPositionY() > 2438.0f)
4282 return false;
4283 }
4284 else if (this->GetPositionY() < 2438.0f)
4285 return false;
4286 }
4287 }
4288 }
4289 else
4290 {
4291 // pussywizard: prevent any bugs by passengers exiting transports or normal creatures flying away
4292 if (c->GetTransport() != this->GetTransport())
4293 return false;
4294 }
4295
4296 LiquidStatus liquidStatus = GetLiquidData().Status;
4297 bool isInWater = (liquidStatus & MAP_LIQUID_STATUS_IN_CONTACT) != 0;
4298
4299 // In water or jumping in water
4300 if (isInWater || (liquidStatus == LIQUID_MAP_ABOVE_WATER && (IsFalling() || (ToPlayer() && ToPlayer()->IsFalling()))))
4301 {
4302 return c->CanEnterWater();
4303 }
4304 else
4305 {
4306 return c->CanWalk() || c->CanFly();
4307 }
4308}
@ MAP_THE_RING_OF_VALOR
Definition AreaDefines.h:261
@ MAP_ICECROWN_CITADEL
Definition AreaDefines.h:265
LiquidStatus
Definition GridTerrainData.h:190
@ LIQUID_MAP_ABOVE_WATER
Definition GridTerrainData.h:192
#define MAP_LIQUID_STATUS_IN_CONTACT
Definition GridTerrainData.h:32
Definition Map.h:689
BattlegroundMap * ToBattlegroundMap()
Definition Map.h:386
bool IsFalling() const
Definition Unit.cpp:19771
LiquidData const & GetLiquidData() const
Definition Object.cpp:3177
LiquidStatus Status
Definition GridTerrainData.h:206

References Creature::CanEnterWater(), Creature::CanFly(), Creature::CanWalk(), WorldObject::GetLiquidData(), WorldObject::GetMap(), WorldLocation::GetMapId(), GetOwnerGUID(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::GetTransport(), IsFalling(), ObjectGuid::IsPlayer(), GameObject::IsStaticTransport(), LIQUID_MAP_ABOVE_WATER, MAP_ICECROWN_CITADEL, MAP_LIQUID_STATUS_IN_CONTACT, MAP_THE_RING_OF_VALOR, LiquidData::Status, Map::ToBattlegroundMap(), and Object::ToPlayer().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), ChaseMovementGenerator< T >::DoUpdate(), FollowerAI::MoveInLineOfSight(), npc_escortAI::MoveInLineOfSight(), npc_pet_hunter_snake_trap::MoveInLineOfSight(), and HostileReference::updateOnlineStatus().

◆ isInBackInMap()

bool Unit::isInBackInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const

◆ IsInCombat()

bool Unit::IsInCombat ( ) const
inline

References HasUnitFlag(), and UNIT_FLAG_IN_COMBAT.

Referenced by _IsValidAttackTarget(), Player::ActivateTaxiPathTo(), npc_anubisath_sentinel::aqsentinelAI::CallBuddiesToAttack(), npc_argent_captainAI::CanAIAttack(), Player::CanEquipItem(), Creature::CanPeriodicallyCallForAssistance(), Player::CanUnequipItem(), boss_high_nethermancer_zerevor::CastDampenMagicIfPossible(), spell_hun_disengage::CheckCast(), Spell::CheckCast(), SpellInfo::CheckTarget(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::CheckTombReset(), CombatStart(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DoAction(), boss_the_lich_king::boss_the_lich_kingAI::DoAction(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::DoAction(), npc_risen_archmage::npc_risen_archmageAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_felblood_kaelthas::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), UnitAI::DoAddAuraToAllHostilePlayers(), Spell::DoAllEffectOnTarget(), UnitAI::DoCastToAllHostilePlayers(), Spell::DoSpellHitOnUnit(), Spell::EffectActivateRune(), npc_clintar_spirit::npc_clintar_spiritAI::EnterEvadeMode(), boss_professor_putricide::boss_professor_putricideAI::EnterEvadeMode(), gunship_npc_AI::EnterEvadeMode(), npc_gunship_boarding_addAI::EnterEvadeMode(), Player::EquipItem(), ResetToHomeOrientation::Execute(), CastRunesEvent::Execute(), GetVelocity(), spell_apothecary_lingering_fumes::HandleAfterCast(), WorldSession::HandleBattlefieldLeaveOpcode(), WorldSession::HandleBattleFieldPortOpcode(), spell_mc_play_dead_aura::HandleEffectRemove(), WorldSession::HandleEquipmentSetUse(), spell_chapter5_return_to_capital::HandleHit(), boss_malygos::boss_malygosAI::HandleIntroSpeech(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMessagechatOpcode(), WorldSession::HandlePetCastSpellOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), ArenaSpectator::HandleSpectatorSpectateCommand(), spell_putricide_mutated_transformation::HandleSummon(), WorldSession::HandleSummonResponseOpcode(), tele_commandscript::HandleTeleCommand(), misc_commandscript::HandleUnstuckCommand(), WorldSession::HandleUseItemOpcode(), npc_pet_mage_mirror_image::InitializeAI(), IsEngaged(), Creature::IsUpdateNeeded(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_anubrekhan::boss_anubrekhanAI::JustSummoned(), boss_kelthuzad::boss_kelthuzadAI::JustSummoned(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), boss_rotface::boss_rotfaceAI::JustSummoned(), boss_nexusprince_shaffar::JustSummoned(), npc_nelson::npc_nelsonAI::JustSummoned(), Pet::LoseHappiness(), CreatureGroup::MemberEvaded(), CreatureAI::MoveInLineOfSight(), boss_muru::MoveInLineOfSight(), boss_eye_of_cthun::MoveInLineOfSight(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::MoveInLineOfSight(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_kelthuzad::boss_kelthuzadAI::MoveInLineOfSight(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_alar::MovementInform(), npc_pet_mage_mirror_image::MySelectNextTarget(), npc_death_knight_initiate::OnGossipHello(), npc_ulduar_expedition_commander::OnGossipHello(), go_ulduar_working_harpoon::OnGossipHello(), npc_death_knight_initiate::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), icecrown_citadel_teleport::OnGossipSelect(), at_frozen_throne_teleport::OnTrigger(), at_naxxramas_hub_portal::OnTrigger(), AreaTrigger_at_voltarus_middle::OnTrigger(), AreaTrigger_at_legion_teleporter::OnTrigger(), RisenArchmageCheck::operator()(), Acore::MostHPMissingInRange::operator()(), Acore::MostHPPercentMissingInRange::operator()(), Acore::FriendlyCCedInRange::operator()(), Acore::FriendlyMissingBuffInRange::operator()(), Acore::AnyAttackableUnitExceptForOriginalCasterInObjectRangeCheck::operator()(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::OwnerAttackedBy(), boss_kologarn::boss_kologarnAI::PassengerBoarded(), SmartScript::ProcessEvent(), Creature::Regenerate(), Player::Regenerate(), Player::RegenerateAll(), Player::RegenerateHealth(), boss_kiljaeden::Reset(), boss_gluth::boss_gluthAI::SelectPlayerInRoom(), instance_naxxramas::SetBossState(), boss_grand_warlock_nethekurse::SetData(), SetInCombatState(), SetSpeed(), boss_prince_keleseth_icc::boss_prince_kelesethAI::SpellHit(), boss_prince_taldaram_icc::boss_prince_taldaramAI::SpellHit(), boss_prince_valanar_icc::boss_prince_valanarAI::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SpellHit(), Spell::SummonGuardian(), lfg::LFGMgr::TeleportPlayer(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), Creature::Update(), TempSummon::Update(), Update(), DistractMovementGenerator::Update(), TotemAI::UpdateAI(), SimpleCharmedAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), npc_scarlet_courier::npc_scarlet_courierAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_thekal::UpdateAI(), npc_zealot_lorkhan::UpdateAI(), npc_zealot_zath::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), boss_faction_championsAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_moorabi::boss_moorabiAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), npc_green_dragon_combat_trigger::npc_green_dragon_combat_triggerAI::UpdateAI(), npc_risen_archmage::npc_risen_archmageAI::UpdateAI(), npc_frost_freeze_trap::npc_frost_freeze_trapAI::UpdateAI(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::UpdateAI(), boss_grobbulus::boss_grobbulusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_hodir::boss_hodirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_pet_mage_mirror_image::UpdateAI(), npc_pet_shaman_earth_elemental::UpdateAI(), npc_pet_shaman_fire_elemental::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), PassiveAI::UpdateAI(), PetAI::UpdateAI(), Player::UpdateContestedPvP(), Creature::UpdateEntry(), boss_bjarngrim::boss_bjarngrimAI::UpdateEscortAI(), InstanceScript::UpdateMinionState(), SmartAI::UpdatePath(), Player::UpdatePotionCooldown(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ IsInCombatWith()

bool Unit::IsInCombatWith ( Unit const *  who) const
20896{
20897 // Check target exists
20898 if (!who)
20899 return false;
20900 // Search in threat list
20901 ObjectGuid guid = who->GetGUID();
20902 for (ThreatContainer::StorageType::const_iterator i = m_ThreatMgr.GetThreatList().begin(); i != m_ThreatMgr.GetThreatList().end(); ++i)
20903 {
20904 HostileReference* ref = (*i);
20905 // Return true if the unit matches
20906 if (ref && ref->getUnitGuid() == guid)
20907 return true;
20908 }
20909 // Nothing found, false.
20910 return false;
20911}
Definition ThreatMgr.h:48
ObjectGuid getUnitGuid() const
Definition ThreatMgr.h:106
ThreatContainer::StorageType const & GetThreatList() const
Definition ThreatMgr.h:273

References Object::GetGUID(), ThreatMgr::GetThreatList(), HostileReference::getUnitGuid(), and m_ThreatMgr.

Referenced by _IsValidAttackTarget(), DealDamage(), Spell::DoAllEffectOnTarget(), TemporaryThreatModifierEvent::Execute(), IsEngagedBy(), and Acore::NearestAttackableUnitInObjectRangeCheck::operator()().

◆ IsInDisallowedMountForm()

bool Unit::IsInDisallowedMountForm ( ) const
21125{
21126 if (SpellInfo const* transformSpellInfo = sSpellMgr->GetSpellInfo(getTransForm()))
21127 {
21128 if (transformSpellInfo->HasAttribute(SPELL_ATTR0_ALLOW_WHILE_MOUNTED))
21129 {
21130 return false;
21131 }
21132 }
21133
21134 if (ShapeshiftForm form = GetShapeshiftForm())
21135 {
21136 SpellShapeshiftFormEntry const* shapeshift = sSpellShapeshiftFormStore.LookupEntry(form);
21137 if (!shapeshift)
21138 {
21139 return true;
21140 }
21141
21142 if (!(shapeshift->flags1 & SHAPESHIFT_FLAG_STANCE))
21143 {
21144 return true;
21145 }
21146 }
21147
21149 {
21150 return false;
21151 }
21152
21153 CreatureDisplayInfoEntry const* display = sCreatureDisplayInfoStore.LookupEntry(GetDisplayId());
21154 if (!display)
21155 {
21156 return true;
21157 }
21158
21160 if (!displayExtra)
21161 {
21162 return true;
21163 }
21164
21165 CreatureModelDataEntry const* model = sCreatureModelDataStore.LookupEntry(display->ModelId);
21166 ChrRacesEntry const* race = sChrRacesStore.LookupEntry(displayExtra->DisplayRaceID);
21167
21168 if (model && !(model->HasFlag(CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT)))
21169 {
21170 if (race && !(race->HasFlag(CHRRACES_FLAGS_CAN_MOUNT)))
21171 {
21172 return true;
21173 }
21174 }
21175
21176 return false;
21177}
@ CHRRACES_FLAGS_CAN_MOUNT
Definition DBCStructure.h:675
@ CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT
Definition DBCStructure.h:771
@ SPELL_ATTR0_ALLOW_WHILE_MOUNTED
Definition SharedDefines.h:406
@ SHAPESHIFT_FLAG_STANCE
Definition UnitDefines.h:104
uint32 getTransForm() const
Definition Unit.h:1881
bool HasFlag(ChrRacesFlags flag) const
Definition DBCStructure.h:700
uint32 ExtendedDisplayInfoID
Definition DBCStructure.h:725
uint32 DisplayRaceID
Definition DBCStructure.h:741
bool HasFlag(CreatureModelDataFlags flag) const
Definition DBCStructure.h:804
uint32 flags1
Definition DBCStructure.h:1823

References CHRRACES_FLAGS_CAN_MOUNT, CREATURE_MODEL_DATA_FLAGS_CAN_MOUNT, CreatureDisplayInfoExtraEntry::DisplayRaceID, CreatureDisplayInfoEntry::ExtendedDisplayInfoID, SpellShapeshiftFormEntry::flags1, GetDisplayId(), GetNativeDisplayId(), GetShapeshiftForm(), getTransForm(), ChrRacesEntry::HasFlag(), CreatureModelDataEntry::HasFlag(), CreatureDisplayInfoEntry::ModelId, sChrRacesStore, sCreatureDisplayInfoExtraStore, sCreatureDisplayInfoStore, sCreatureModelDataStore, SHAPESHIFT_FLAG_STANCE, SPELL_ATTR0_ALLOW_WHILE_MOUNTED, sSpellMgr, and sSpellShapeshiftFormStore.

Referenced by Player::ActivateTaxiPathTo(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), Spell::CheckCast(), Player::ContinueTaxiFlight(), and Player::ProcessDelayedOperations().

◆ IsInFeralForm()

bool Unit::IsInFeralForm ( ) const
inline

◆ IsInFlight()

bool Unit::IsInFlight ( ) const
inline

◆ isInFrontInMap()

bool Unit::isInFrontInMap ( Unit const *  target,
float  distance,
float  arc = M_PI 
) const
4240{
4241 return IsWithinDistInMap(target, distance) && HasInArc(arc, target);
4242}

References Position::HasInArc(), and WorldObject::IsWithinDistInMap().

◆ IsInnkeeper()

bool Unit::IsInnkeeper ( ) const
inline
@ UNIT_NPC_FLAG_INNKEEPER
Definition UnitDefines.h:331

References HasNpcFlag(), and UNIT_NPC_FLAG_INNKEEPER.

Referenced by npc_innkeeper::OnGossipHello().

◆ IsInPartyWith()

bool Unit::IsInPartyWith ( Unit const *  unit) const
18861{
18862 if (this == unit)
18863 return true;
18864
18865 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18866 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18867 if (u1 == u2)
18868 return true;
18869
18870 if (u1->IsPlayer() && u2->IsPlayer())
18871 return u1->ToPlayer()->IsInSameGroupWith(u2->ToPlayer());
18872 // Xinef: we assume that npcs with the same faction are in party
18873 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18874 return u1->GetFaction() == u2->GetFaction();
18875 // Xinef: creature type_flag should work for party check only if player group is not a raid
18878 return true;
18879 else
18880 return false;
18881}
bool isRaidGroup() const
Definition Group.cpp:2270
bool IsInSameGroupWith(Player const *p) const
Definition Player.cpp:2317

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), Player::GetGroup(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameGroupWith(), Object::IsPlayer(), Group::isRaidGroup(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by SpellInfo::CheckExplicitTarget(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), and Acore::WorldObjectSpellTargetCheck::operator()().

◆ IsInRaidWith()

bool Unit::IsInRaidWith ( Unit const *  unit) const
18884{
18885 if (this == unit)
18886 return true;
18887
18888 Unit const* u1 = GetCharmerOrOwnerOrSelf();
18889 Unit const* u2 = unit->GetCharmerOrOwnerOrSelf();
18890 if (u1 == u2)
18891 return true;
18892
18893 if (u1->IsPlayer() && u2->IsPlayer())
18894 return u1->ToPlayer()->IsInSameRaidWith(u2->ToPlayer());
18895 // Xinef: we assume that npcs with the same faction are in party
18896 else if (u1->IsCreature() && u2->IsCreature() && !u1->IsControlledByPlayer() && !u2->IsControlledByPlayer())
18897 return u1->GetFaction() == u2->GetFaction();
18900 return true;
18901 else
18902 return false;
18903}

References CREATURE_TYPE_FLAG_TREAT_AS_RAID_UNIT, GetCharmerOrOwnerOrSelf(), Creature::GetCreatureTemplate(), GetFaction(), IsControlledByPlayer(), Object::IsCreature(), Player::IsInSameRaidWith(), Object::IsPlayer(), Object::ToCreature(), Object::ToPlayer(), and CreatureTemplate::type_flags.

Referenced by Corpse::BuildValuesUpdate(), SpellInfo::CheckExplicitTarget(), spell_dru_t10_restoration_4p_bonus::FilterTargets(), GetReactionTo(), WorldSession::HandleLootMasterGiveOpcode(), SpellClickInfo::IsFitToRequirements(), Condition::Meets(), Acore::AnyGroupedUnitInObjectRangeCheck::operator()(), Acore::WorldObjectSpellTargetCheck::operator()(), and PatchValuesUpdate().

◆ IsInSanctuary()

bool Unit::IsInSanctuary ( ) const
inline

◆ IsInWater()

bool Unit::IsInWater ( ) const
virtual

◆ IsLevitating()

◆ IsMounted()

◆ IsMovementPreventedByCasting()

bool Unit::IsMovementPreventedByCasting ( ) const
virtual

Reimplemented in Creature.

4216{
4217 // can always move when not casting
4219 {
4220 return false;
4221 }
4222
4223 // channeled spells during channel stage (after the initial cast timer) allow movement with a specific spell attribute
4225 {
4226 if (spell->getState() != SPELL_STATE_FINISHED && spell->IsChannelActive())
4227 {
4228 if (spell->GetSpellInfo()->IsActionAllowedChannel())
4229 {
4230 return false;
4231 }
4232 }
4233 }
4234
4235 // prohibit movement for all other spell casts
4236 return true;
4237}
@ UNIT_STATE_CASTING
Definition UnitDefines.h:185

References CURRENT_CHANNELED_SPELL, HasUnitState(), m_currentSpells, SPELL_STATE_FINISHED, and UNIT_STATE_CASTING.

Referenced by TimedFleeingMovementGenerator::Update().

◆ isMoving()

◆ IsNeutralToAll()

bool Unit::IsNeutralToAll ( ) const
10321{
10322 FactionTemplateEntry const* my_faction = GetFactionTemplateEntry();
10323 if (!my_faction || !my_faction->faction)
10324 return true;
10325
10326 FactionEntry const* raw_faction = sFactionStore.LookupEntry(my_faction->faction);
10327 if (raw_faction && raw_faction->reputationListID >= 0)
10328 return false;
10329
10330 return my_faction->IsNeutralToAll();
10331}
bool IsNeutralToAll() const
Definition DBCStructure.h:982

References FactionTemplateEntry::faction, GetFactionTemplateEntry(), FactionTemplateEntry::IsNeutralToAll(), FactionEntry::reputationListID, and sFactionStore.

Referenced by Creature::_IsTargetAcceptable(), Creature::CanStartAttack(), AggressorAI::Permissible(), and ReactorAI::Permissible().

◆ IsNonMeleeSpellCast()

bool Unit::IsNonMeleeSpellCast ( bool  withDelayed,
bool  skipChanneled = false,
bool  skipAutorepeat = false,
bool  isAutoshoot = false,
bool  skipInstant = true 
) const
4147{
4148 // We don't do loop here to explicitly show that melee spell is excluded.
4149 // Maybe later some special spells will be excluded too.
4150
4151 // generic spells are cast when they are not finished and not delayed
4154 (withDelayed || m_currentSpells[CURRENT_GENERIC_SPELL]->getState() != SPELL_STATE_DELAYED))
4155 {
4156 if (!skipInstant || m_currentSpells[CURRENT_GENERIC_SPELL]->GetCastTime())
4157 {
4158 if (!isAutoshoot || !m_currentSpells[CURRENT_GENERIC_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4159 return true;
4160 }
4161 }
4162 // channeled spells may be delayed, but they are still considered cast
4163 if (!skipChanneled && m_currentSpells[CURRENT_CHANNELED_SPELL] &&
4165 {
4166 if (!isAutoshoot || !m_currentSpells[CURRENT_CHANNELED_SPELL]->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
4167 return true;
4168 }
4169 // autorepeat spells may be finished or delayed, but they are still considered cast
4170 if (!skipAutorepeat && m_currentSpells[CURRENT_AUTOREPEAT_SPELL])
4171 return true;
4172
4173 return false;
4174}
@ SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS
Definition SharedDefines.h:473

References CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, m_currentSpells, SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_DELAYED, and SPELL_STATE_FINISHED.

Referenced by Spell::_cast(), _UpdateAutoRepeatSpell(), Player::ActivateSpec(), Player::ActivateTaxiPathTo(), Player::CanEquipItem(), Player::CanExecutePendingSpellCastRequest(), CombatStop(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), ScriptedAI::DoCastSpell(), Spell::EffectKnockBack(), Spell::finish(), WorldSession::HandleCancelCastOpcode(), WorldSession::HandleSetRaidDifficultyOpcode(), isSpellBlocked(), boss_shade_of_aran::JustEngagedWith(), boss_pandemonius::JustEngagedWith(), MeleeSpellHitResult(), Spell::prepare(), SmartScript::ProcessEvent(), RollMeleeOutcomeAgainst(), setDeathState(), StopAttackFaction(), boss_netherspite::SwitchToPortalPhase(), Player::TeleportTo(), TotemAI::UpdateAI(), npc_chesspiece::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_warmage_violetstand::UpdateAI(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ IsOnVehicle()

◆ IsPet()

bool Unit::IsPet ( ) const
inline
747{ return m_unitTypeMask & UNIT_MASK_PET; }
@ UNIT_MASK_PET
Definition UnitDefines.h:160

References m_unitTypeMask, and UNIT_MASK_PET.

Referenced by Spell::_cast(), Spell::AddUnitTarget(), spell_warl_demonic_pact_aura::AfterCheckProc(), Creature::AllLootRemovedFromCorpse(), BeforeVisibilityDestroy< Creature >(), Creature::CallAssistance(), Creature::CallForHelp(), boss_renataki::boss_renatakiAI::CanAlwaysBeDetectable(), boss_renataki::boss_renatakiAI::CanSeeAlways(), Creature::CanSwim(), ClearInCombat(), CombatStart(), Creature::CreateFromProto(), Player::CreatePet(), DealDamage(), MotionTransport::DelayedTeleportTransport(), PetAI::DoAttack(), ChaseMovementGenerator< T >::DoUpdate(), Spell::EffectDismissPet(), Spell::EffectForceDeselect(), Spell::EffectRenamePet(), Spell::EffectSanctuary(), Spell::EffectSchoolDMG(), Spell::EffectTameCreature(), Acore::XP::Gain(), Creature::GetAggroRange(), GetCastingTimeForBonus(), GetCombatRatingReduction(), GetCreatePowers(), GetNextRandomRaidMemberOrPet(), GetRandomContactPoint(), GetVelocity(), AuraEffect::HandleAuraModResistance(), AuraEffect::HandleAuraModStat(), debug_commandscript::HandleDebugThreatListCommand(), AuraEffect::HandleFeignDeath(), modify_commandscript::HandleModifyTalentCommand(), AuraEffect::HandleModPossessPet(), AuraEffect::HandleModResistancePercent(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcDeleteCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_commandscript::HandleNpcSetModelCommand(), npc_commandscript::HandleNpcSetMoveTypeCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), npc_commandscript::HandleNpcTameCommand(), WorldSession::HandlePetAbandon(), WorldSession::HandlePetActionHelper(), WorldSession::HandlePetCastSpellOpcode(), pet_commandscript::HandlePetCreateCommand(), WorldSession::HandlePetRename(), WorldSession::HandlePetSetAction(), misc_commandscript::HandleRespawnCommand(), Creature::InitEntry(), TempSummon::InitStats(), Guardian::InitStatsForLevel(), DisableMgr::IsDisabledFor(), Creature::isElite(), Minion::IsGuardianPet(), Player::isHonorOrXPTarget(), Creature::isWorldBoss(), npc_webbed_creature::npc_webbed_creatureAI::JustDied(), npc_underbat::JustEngagedWith(), npc_vekniss_stinger::JustEngagedWith(), boss_murmur::JustEngagedWith(), Kill(), spell_hun_target_self_and_pet::Load(), ModSpellCastTime(), CreatureAI::MoveBackwardsChecks(), CreatureAI::MoveCircleChecks(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::MoveInLineOfSight(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::MoveInLineOfSight(), Acore::MostHPMissingGroupInRange::operator()(), PetAI::ReceiveEmote(), RollMeleeOutcomeAgainst(), FactorySelector::SelectAI(), Creature::SelectLevel(), WorldSession::SendPetNameQuery(), Spell::SendSpellGo(), Spell::SendSpellStart(), SetCharm(), Creature::SetDisplayId(), SetHealth(), SetInCombatState(), SetMinion(), Creature::SetObjectScale(), setPowerType(), SpellDamageBonusDone(), SpellPctDamageModsDone(), ToPet(), TempSummon::UnSummon(), Update(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_hazzarah::UpdateAI(), PetAI::UpdateAI(), Player::UpdateAreaDependentAuras(), UpdateAuraForGroup(), Creature::UpdateEntry(), Creature::UpdateMoveInLineOfSightState(), and UpdateSpeed().

◆ IsPetAura()

bool Unit::IsPetAura ( Aura const *  aura)
17409{
17410 Unit* owner = GetOwner();
17411
17412 if (!owner || !owner->IsPlayer())
17413 return false;
17414
17415 // if the owner has that pet aura, return true
17416 for (PetAura const* petAura : owner->m_petAuras)
17417 if (petAura->GetAura(GetEntry()) == aura->GetId())
17418 return true;
17419
17420 return false;
17421}
Definition SpellMgr.h:470
uint32 GetId(std::string const &username)
Definition AccountMgr.cpp:236

References Object::GetEntry(), Aura::GetId(), GetOwner(), Object::IsPlayer(), and m_petAuras.

Referenced by Pet::_SaveAuras(), and Spell::EffectSummonPet().

◆ IsPetInCombat()

bool Unit::IsPetInCombat ( ) const
inline

◆ IsPolymorphed()

bool Unit::IsPolymorphed ( ) const
16814{
16815 uint32 transformId = getTransForm();
16816 if (!transformId)
16817 return false;
16818
16819 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(transformId);
16820 if (!spellInfo)
16821 return false;
16822
16823 return spellInfo->GetSpellSpecific() == SPELL_SPECIFIC_MAGE_POLYMORPH;
16824}
@ SPELL_SPECIFIC_MAGE_POLYMORPH
Definition SpellInfo.h:160
SpellSpecificType GetSpellSpecific() const
Definition SpellInfo.cpp:2149

References SpellInfo::GetSpellSpecific(), getTransForm(), SPELL_SPECIFIC_MAGE_POLYMORPH, and sSpellMgr.

Referenced by Attack(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), Player::RegenerateAll(), Creature::RegenerateHealth(), Player::RegenerateHealth(), and Creature::Update().

◆ isPossessed()

◆ isPossessedByPlayer()

bool Unit::isPossessedByPlayer ( ) const
inline

◆ isPossessing() [1/2]

bool Unit::isPossessing ( ) const
inline
1241 {
1242 if (Unit* u = GetCharm())
1243 return u->isPossessed();
1244 else
1245 return false;
1246 }

References GetCharm().

Referenced by WorldSession::HandleCastSpellOpcode(), and misc_commandscript::HandleUnbindSightCommand().

◆ isPossessing() [2/2]

bool Unit::isPossessing ( Unit u) const
inline
1247{ return u->isPossessed() && GetCharmGUID() == u->GetGUID(); }
bool isPossessed() const
Definition Unit.h:1238

References GetCharmGUID(), Object::GetGUID(), and isPossessed().

◆ IsPvP()

◆ IsQuestGiver()

bool Unit::IsQuestGiver ( ) const
inline
@ UNIT_NPC_FLAG_QUESTGIVER
Definition UnitDefines.h:316

References HasNpcFlag(), and UNIT_NPC_FLAG_QUESTGIVER.

Referenced by npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_lokhtos_darkbargainer::OnGossipHello(), npc_highlord_darion_mograine::OnGossipHello(), npc_augustus_the_touched::OnGossipHello(), npc_parqual_fintallas::OnGossipHello(), npc_varian_wrynn::OnGossipHello(), npc_thrall_bfu::OnGossipHello(), npc_cos_chromie_middle::OnGossipHello(), npcs_riverbreeze_and_silversky::OnGossipHello(), npc_thrall_warchief::OnGossipHello(), npc_braug_dimspirit::OnGossipHello(), npc_steward_of_time::OnGossipHello(), npc_stone_watcher_of_norgannon::OnGossipHello(), npc_rivern_frostwind::OnGossipHello(), npc_fos_leader::OnGossipHello(), npc_hor_leader::OnGossipHello(), npc_oculus_drakegiver::OnGossipHello(), npc_shandy_dalaran::OnGossipHello(), npc_razael_and_lyana::OnGossipHello(), npc_mcmanus::OnGossipHello(), npc_vekjik::OnGossipHello(), npc_avatar_of_freya::OnGossipHello(), npc_roxi_ramrocket::OnGossipHello(), npc_wg_demolisher_engineer::OnGossipHello(), npc_wg_spirit_guide::OnGossipHello(), npc_wg_queue::OnGossipHello(), npc_wg_quest_giver::OnGossipHello(), npc_finklestein::OnGossipHello(), npc_captain_saeed::OnGossipHello(), npc_innkeeper::OnGossipHello(), npc_prof_alchemy::OnGossipHello(), npc_prof_blacksmith::OnGossipHello(), npc_prof_leather::OnGossipHello(), npc_prof_tailor::OnGossipHello(), npc_taxi::OnGossipHello(), npc_riggle_bassbait::OnGossipHello(), and npc_sayge::OnGossipHello().

◆ IsScriptOverriden()

AuraEffect * Unit::IsScriptOverriden ( SpellInfo const *  spell,
int32  script 
) const
5889{
5891 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
5892 {
5893 if ((*i)->GetMiscValue() == script)
5894 if ((*i)->IsAffectedOnSpell(spell))
5895 return (*i);
5896 }
5897 return nullptr;
5898}
@ SPELL_AURA_OVERRIDE_CLASS_SCRIPTS
Definition SpellAuraDefines.h:175

References GetAuraEffectsByType(), and SPELL_AURA_OVERRIDE_CLASS_SCRIPTS.

Referenced by Spell::CheckCast(), Spell::EffectWeaponDmg(), and AuraEffect::HandleAuraModShapeshift().

◆ IsServiceProvider()

bool Unit::IsServiceProvider ( ) const
inline

◆ IsSitState()

bool Unit::IsSitState ( ) const
16784{
16785 uint8 s = getStandState();
16786 return
16790}
@ UNIT_STAND_STATE_SIT_HIGH_CHAIR
Definition UnitDefines.h:38
@ UNIT_STAND_STATE_SIT_MEDIUM_CHAIR
Definition UnitDefines.h:37
@ UNIT_STAND_STATE_SIT_LOW_CHAIR
Definition UnitDefines.h:36
@ UNIT_STAND_STATE_SIT_CHAIR
Definition UnitDefines.h:34

References getStandState(), UNIT_STAND_STATE_SIT, UNIT_STAND_STATE_SIT_CHAIR, UNIT_STAND_STATE_SIT_HIGH_CHAIR, UNIT_STAND_STATE_SIT_LOW_CHAIR, and UNIT_STAND_STATE_SIT_MEDIUM_CHAIR.

Referenced by _ApplyAura(), AttackerStateUpdate(), WorldSession::HandleMovementOpcodes(), IsStandState(), Spell::prepare(), and SpellTakenCritChance().

◆ isSpellBlocked()

bool Unit::isSpellBlocked ( Unit victim,
SpellInfo const *  spellProto,
WeaponAttackType  attackType = BASE_ATTACK 
)
3129{
3130 // These spells can't be blocked
3131 if (spellProto && spellProto->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3132 return false;
3133
3134 if (victim->HasIgnoreHitDirectionAura() || victim->HasInArc(M_PI, this))
3135 {
3136 // Check creatures flags_extra for disable block
3137 if (victim->IsCreature() &&
3139 return false;
3140
3141 float blockChance = victim->GetUnitBlockChance();
3142 blockChance += (int32(GetWeaponSkillValue(attackType)) - int32(victim->GetMaxSkillValueForLevel())) * 0.04f;
3143
3144 // xinef: cant block while casting or while stunned
3145 if (blockChance < 0.0f || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3146 blockChance = 0.0f;
3147
3148 if (roll_chance_f(blockChance))
3149 return true;
3150 }
3151 return false;
3152}
@ CREATURE_FLAG_EXTRA_NO_BLOCK
Definition CreatureData.h:49
@ SPELL_ATTR0_NO_ACTIVE_DEFENSE
Definition SharedDefines.h:403
@ UNIT_STATE_CONTROLLED
Definition UnitDefines.h:211
bool HasIgnoreHitDirectionAura() const
Definition Unit.h:1726
uint32 GetWeaponSkillValue(WeaponAttackType attType, Unit const *target=nullptr) const
Definition Unit.cpp:3818
float GetUnitBlockChance() const
Definition Unit.cpp:3730

References CREATURE_FLAG_EXTRA_NO_BLOCK, GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), Object::IsCreature(), IsNonMeleeSpellCast(), roll_chance_f(), SPELL_ATTR0_NO_ACTIVE_DEFENSE, Object::ToCreature(), and UNIT_STATE_CONTROLLED.

Referenced by CalculateSpellDamageTaken().

◆ IsSpiritGuide()

bool Unit::IsSpiritGuide ( ) const
inline

◆ IsSpiritHealer()

bool Unit::IsSpiritHealer ( ) const
inline

◆ IsSpiritService()

◆ IsStandState()

◆ IsStopped()

bool Unit::IsStopped ( ) const
inline

◆ IsSummon()

bool Unit::IsSummon ( ) const
inline
@ UNIT_MASK_SUMMON
Definition UnitDefines.h:156

References m_unitTypeMask, and UNIT_MASK_SUMMON.

Referenced by Creature::CanPeriodicallyCallForAssistance(), spell_item_unsated_craving::CheckProc(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Spell::EffectScriptEffect(), boss_skeram::EnterEvadeMode(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), Spell::finish(), GetAllMinionsByEntry(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pri_lightwell::HandleScriptEffect(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), boss_skeram::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), boss_skeram::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), BattlefieldWG::OnCreatureCreate(), InstanceScript::OnCreatureCreate(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnCreatureCreate(), instance_hyjal::instance_mount_hyjal_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), instance_blackfathom_deeps::instance_blackfathom_deeps_InstanceMapScript::OnUnitDeath(), RemoveAllControlled(), RemoveAllMinionsByEntry(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), Creature::SaveRespawnTime(), Creature::SearchFormation(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), ToTempSummon(), ToTempSummon(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), boss_skeram::UpdateAI(), npc_oculus_drake::npc_oculus_drakeAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), and Player::VehicleSpellInitialize().

◆ isSwimming()

◆ IsTabardDesigner()

bool Unit::IsTabardDesigner ( ) const
inline

◆ isTargetableForAttack()

◆ IsTaxi()

bool Unit::IsTaxi ( ) const
inline

◆ IsTotem()

◆ IsTrainer()

◆ IsTriggeredAtSpellProcEvent()

bool Unit::IsTriggeredAtSpellProcEvent ( Unit victim,
Aura aura,
WeaponAttackType  attType,
bool  isVictim,
bool  active,
SpellProcEventEntry const *&  spellProcEvent,
ProcEventInfo const &  eventInfo 
)
private
17496{
17497 SpellInfo const* spellProto = aura->GetSpellInfo();
17498 SpellInfo const* procSpell = eventInfo.GetSpellInfo();
17499
17500 // let the aura be handled by new proc system if it has new entry
17501 if (sSpellMgr->GetSpellProcEntry(spellProto->Id))
17502 return false;
17503
17504 // Get proc Event Entry
17505 spellProcEvent = sSpellMgr->GetSpellProcEvent(spellProto->Id);
17506
17507 // Get EventProcFlag
17508 uint32 EventProcFlag;
17509 if (spellProcEvent && spellProcEvent->procFlags) // if exist get custom spellProcEvent->procFlags
17510 EventProcFlag = spellProcEvent->procFlags;
17511 else
17512 EventProcFlag = spellProto->ProcFlags; // else get from spell proto
17513 // Continue if no trigger exist
17514 if (!EventProcFlag)
17515 return false;
17516
17517 // Additional checks for triggered spells (ignore trap casts)
17518 if (eventInfo.GetHitMask() & PROC_EX_INTERNAL_TRIGGERED && !(EventProcFlag & PROC_FLAG_DONE_TRAP_ACTIVATION))
17519 {
17521 return false;
17522 }
17523
17524 // Xinef: additional check for player auras - only player spells can trigger player proc auras
17525 // Xinef: skip victim auras
17526 // Excluded player shoot spells
17527 // Excluded player item spells
17528 if (!isVictim && IsPlayer() && !(EventProcFlag & (PROC_FLAG_KILL | PROC_FLAG_DEATH)))
17529 {
17530 if (procSpell && procSpell->SpellFamilyName == SPELLFAMILY_GENERIC && procSpell->GetCategory() != 76 &&
17531 (!eventInfo.GetProcSpell() || !eventInfo.GetProcSpell()->m_CastItem) &&
17532 (!eventInfo.GetTriggerAuraSpell() || eventInfo.GetTriggerAuraSpell()->SpellFamilyName == SPELLFAMILY_GENERIC))
17533 {
17534 return false;
17535 }
17536 }
17537
17538 // Check spellProcEvent data requirements
17539 if (!sSpellMgr->IsSpellProcEventCanTriggeredBy(spellProto, spellProcEvent, EventProcFlag, eventInfo, active))
17540 return false;
17541 // In most cases req get honor or XP from kill
17542 if (EventProcFlag & PROC_FLAG_KILL && IsPlayer())
17543 {
17544 bool allow = false;
17545
17546 if (victim)
17547 allow = ToPlayer()->isHonorOrXPTarget(victim);
17548
17549 // Shadow Word: Death - can trigger from every kill
17550 if (aura->GetId() == 32409 || aura->GetId() == 18372 || aura->GetId() == 18213)
17551 allow = true;
17552 if (!allow)
17553 return false;
17554 }
17555 // Aura added by spell can`t trigger from self (prevent drop charges/do triggers)
17556 // But except periodic and kill triggers (can triggered from self)
17557 if (procSpell && procSpell->Id == spellProto->Id
17558 && !(spellProto->ProcFlags & (PROC_FLAG_TAKEN_PERIODIC | PROC_FLAG_KILL)))
17559 return false;
17560
17561 // Check if current equipment allows aura to proc
17562 if (!isVictim && IsPlayer() && !spellProto->HasAttribute(SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT))
17563 {
17564 Player* player = ToPlayer();
17565 if (spellProto->EquippedItemClass == ITEM_CLASS_WEAPON)
17566 {
17567 Item* item = nullptr;
17568 if (attType == BASE_ATTACK)
17570 else if (attType == OFF_ATTACK)
17572 else
17574
17575 if (player->IsInFeralForm())
17576 return false;
17577
17578 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_WEAPON || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17579 return false;
17580 }
17581 else if (spellProto->EquippedItemClass == ITEM_CLASS_ARMOR)
17582 {
17583 // Check if player is wearing shield
17585 if (!item || item->IsBroken() || item->GetTemplate()->Class != ITEM_CLASS_ARMOR || !((1 << item->GetTemplate()->SubClass) & spellProto->EquippedItemSubClassMask))
17586 return false;
17587 }
17588 }
17589 // Get chance from spell
17590 float chance = float(spellProto->ProcChance);
17591 // If in spellProcEvent exist custom chance, chance = spellProcEvent->customChance;
17592 if (spellProcEvent && spellProcEvent->customChance)
17593 chance = spellProcEvent->customChance;
17594 // If PPM exist calculate chance from PPM
17595 if (spellProcEvent && spellProcEvent->ppmRate != 0)
17596 {
17597 uint32 attackSpeed = 0;
17598 Unit* attacker = nullptr;
17599 if (!isVictim)
17600 attacker = this;
17601 else if (victim)
17602 attacker = victim;
17603
17604 if (attacker)
17605 {
17606 if (!procSpell || procSpell->DmgClass == SPELL_DAMAGE_CLASS_MELEE || procSpell->IsRangedWeaponSpell())
17607 {
17608 attackSpeed = attacker->GetAttackTime(attType);
17609 }
17610 else //spells user their casttime for ppm calculations
17611 {
17612 if (procSpell->CastTimeEntry)
17613 attackSpeed = procSpell->CastTimeEntry->CastTime;
17614
17615 //instants and fast spells use 1.5s castspeed
17616 if (attackSpeed < 1500)
17617 attackSpeed = 1500;
17618 }
17619 }
17620 chance = GetPPMProcChance(attackSpeed, spellProcEvent->ppmRate, spellProto);
17621 }
17622
17623 // Custom chances
17624 switch (spellProto->SpellFamilyName)
17625 {
17627 {
17628 // Recklessness, allow to proc only once for whirlwind
17629 if (spellProto->Id == 1719 && procSpell && procSpell->Id == 44949)
17630 return false;
17631 }
17632 }
17633
17634 if (eventInfo.GetProcChance())
17635 {
17636 chance = *eventInfo.GetProcChance();
17637 }
17638
17639 // Apply chance modifer aura
17640 if (Player* modOwner = GetSpellModOwner())
17641 {
17642 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CHANCE_OF_SUCCESS, chance);
17643 }
17644
17645 return roll_chance_f(chance);
17646}
@ ITEM_CLASS_ARMOR
Definition ItemTemplate.h:295
@ ITEM_CLASS_WEAPON
Definition ItemTemplate.h:293
@ EQUIPMENT_SLOT_RANGED
Definition Player.h:699
@ SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT
Definition SharedDefines.h:494
@ SPELL_ATTR3_CAN_PROC_FROM_PROCS
Definition SharedDefines.h:519
@ SPELLMOD_CHANCE_OF_SUCCESS
Definition SpellDefines.h:94
@ PROC_EX_INTERNAL_TRIGGERED
Definition SpellMgr.h:221
@ PROC_FLAG_DEATH
Definition SpellMgr.h:143
@ PROC_FLAG_TAKEN_PERIODIC
Definition SpellMgr.h:135
@ PROC_FLAG_KILL
Definition SpellMgr.h:108
@ PROC_FLAG_DONE_TRAP_ACTIVATION
Definition SpellMgr.h:138
Item * GetUseableItemByPos(uint8 bag, uint8 slot) const
Definition Player.h:1266
bool isHonorOrXPTarget(Unit *victim) const
Definition Player.cpp:12646
uint32 GetCategory() const
Definition SpellInfo.cpp:871
int32 EquippedItemClass
Definition SpellInfo.h:375
uint32 ProcFlags
Definition SpellInfo.h:355
int32 EquippedItemSubClassMask
Definition SpellInfo.h:376
SpellCastTimesEntry const * CastTimeEntry
Definition SpellInfo.h:347
uint32 DmgClass
Definition SpellInfo.h:389
bool IsRangedWeaponSpell() const
Definition SpellInfo.cpp:1276
float GetPPMProcChance(uint32 WeaponSpeed, float PPM, SpellInfo const *spellProto) const
Definition Unit.cpp:13534
uint32 Class
Definition ItemTemplate.h:621
int32 CastTime
Definition DBCStructure.h:1761

References BASE_ATTACK, SpellCastTimesEntry::CastTime, SpellInfo::CastTimeEntry, ItemTemplate::Class, SpellProcEventEntry::customChance, SpellInfo::DmgClass, EQUIPMENT_SLOT_MAINHAND, EQUIPMENT_SLOT_OFFHAND, EQUIPMENT_SLOT_RANGED, SpellInfo::EquippedItemClass, SpellInfo::EquippedItemSubClassMask, GetAttackTime(), SpellInfo::GetCategory(), ProcEventInfo::GetHitMask(), Aura::GetId(), GetPPMProcChance(), ProcEventInfo::GetProcChance(), ProcEventInfo::GetProcSpell(), ProcEventInfo::GetSpellInfo(), Aura::GetSpellInfo(), GetSpellModOwner(), Item::GetTemplate(), ProcEventInfo::GetTriggerAuraSpell(), Player::GetUseableItemByPos(), SpellInfo::HasAttribute(), SpellInfo::Id, INVENTORY_SLOT_BAG_0, Item::IsBroken(), Player::isHonorOrXPTarget(), IsInFeralForm(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), ITEM_CLASS_ARMOR, ITEM_CLASS_WEAPON, Spell::m_CastItem, OFF_ATTACK, SpellProcEventEntry::ppmRate, PROC_EX_INTERNAL_TRIGGERED, PROC_FLAG_DEATH, PROC_FLAG_DONE_TRAP_ACTIVATION, PROC_FLAG_KILL, PROC_FLAG_TAKEN_PERIODIC, SpellInfo::ProcChance, SpellInfo::ProcFlags, SpellProcEventEntry::procFlags, roll_chance_f(), SPELL_ATTR3_CAN_PROC_FROM_PROCS, SPELL_ATTR3_NO_PROC_EQUIP_REQUIREMENT, SPELL_DAMAGE_CLASS_MELEE, SPELLFAMILY_GENERIC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyName, SPELLMOD_CHANCE_OF_SUCCESS, sSpellMgr, ItemTemplate::SubClass, and Object::ToPlayer().

Referenced by ProcDamageAndSpellFor().

◆ isTurning()

bool Unit::isTurning ( ) const
inline

◆ IsUnderLastManaUseEffect()

bool Unit::IsUnderLastManaUseEffect ( ) const

◆ IsUnderWater()

bool Unit::IsUnderWater ( ) const
virtual
4401{
4403}
@ LIQUID_MAP_UNDER_WATER
Definition GridTerrainData.h:195

References WorldObject::GetLiquidData(), LIQUID_MAP_UNDER_WATER, and LiquidData::Status.

Referenced by Creature::setDeathState().

◆ IsValidAssistTarget()

bool Unit::IsValidAssistTarget ( Unit const *  target) const
14085{
14086 return _IsValidAssistTarget(target, nullptr);
14087}
bool _IsValidAssistTarget(Unit const *target, SpellInfo const *bySpell) const
Definition Unit.cpp:14090

References _IsValidAssistTarget().

Referenced by SmartAI::AssistPlayerInCombatAgainst().

◆ IsValidAttackTarget()

bool Unit::IsValidAttackTarget ( Unit const *  target,
SpellInfo const *  bySpell = nullptr 
) const
13962{
13963 return _IsValidAttackTarget(target, bySpell);
13964}

References _IsValidAttackTarget().

Referenced by npc_escortAI::AssistPlayerInCombatAgainst(), Creature::CanCreatureAttack(), spell_pal_holy_shock::CheckCast(), spell_pri_penance::CheckCast(), CreatureGroup::GetNewTargetForMember(), WorldSession::HandleAttackSwingOpcode(), spell_teron_gorefiend_shadowy_construct::HandleEffectApply(), npc_beryl_sorcerer::npc_beryl_sorcererAI::JustEngagedWith(), CreatureGroup::MemberEngagingTarget(), npc_icc_vengeful_fleshreaper::npc_icc_vengeful_fleshreaperAI::MoveInLineOfSight(), boss_doomwalker::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_air_force_bots::npc_air_force_botsAI::MoveInLineOfSight(), npc_pet_dk_ebon_gargoyle::MySelectNextTarget(), Acore::NearestAttackableNoTotemUnitInObjectRangeCheck::operator()(), Acore::NearestHostileUnitCheck::operator()(), MalleableGooSelector::operator()(), Acore::AnyUnfriendlyAttackableVisibleUnitInObjectRangeCheck::operator()(), SelectNearbyNoTotemTarget(), SelectNearbyTarget(), CreatureAI::SetGazeOn(), StopAttackingInvalidTarget(), SimpleCharmedAI::UpdateAI(), npc_anubarak_spike::npc_anubarak_spikeAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI(), npc_putricide_oozeAI::UpdateAI(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_four_horsemen::boss_four_horsemenAI::UpdateAI(), PossessedAI::UpdateAI(), Player::UpdateCharmedAI(), Player::UpdateFFAPvPFlag(), and Player::UpdateFFAPvPState().

◆ IsVehicle()

bool Unit::IsVehicle ( ) const
inline

References m_unitTypeMask, and UNIT_MASK_VEHICLE.

Referenced by Battleground::AddCreature(), Creature::AddToWorld(), ApplyResilience(), CanHaveThreatList(), spell_wintergrasp_water::CheckCast(), Spell::CheckEffectTarget(), SpellInfo::CheckTarget(), Map::CreatureRelocation(), DealDamage(), DealMeleeDamage(), MotionTransport::DelayedTeleportTransport(), Spell::EffectDummy(), Spell::EffectKnockBack(), Spell::EffectSummonType(), CreatureAI::EnterEvadeMode(), SmartScript::GetTargets(), GetVelocity(), AuraEffect::HandleAuraControlVehicle(), debug_commandscript::HandleDebugEnterVehicleCommand(), debug_commandscript::HandleDebugSetVehicleIdCommand(), spell_q13280_13283_plant_battle_standard::HandleDummy(), BattlefieldWG::HandleKill(), BattlegroundIC::HandleKillUnit(), WorldSession::HandlePetActionHelper(), spell_q12919_gymers_throw::HandleScript(), spell_putricide_mutated_transformation::HandleSummon(), TempSummon::InitStats(), KillRewarder::KillRewarder(), spell_igb_overheat_aura::Load(), MagicSpellHitResult(), npc_brann_radio::npc_brann_radioAI::MoveInLineOfSight(), BattlefieldWG::OnUnitDeath(), OutDebugInfo(), VehicleAI::Permissible(), Map::PlayerRelocation(), SmartScript::ProcessAction(), RemoveCharmedBy(), RemoveFromWorld(), Spell::SelectImplicitCasterObjectTargets(), SetCharmedBy(), SetOwnerGUID(), SetSpeed(), Player::StopCastingCharm(), Map::SummonCreature(), UpdateCharmAI(), Creature::UpdateEntry(), UpdateHeight(), UpdateOrientation(), and UpdateSpeed().

◆ IsVendor()

◆ IsVisible()

bool Unit::IsVisible ( ) const
inline
@ SEC_PLAYER
Definition Common.h:57
@ SERVERSIDE_VISIBILITY_GM
Definition SharedDefines.h:1273
T_VALUES GetValue(FLAG_TYPE flag) const
Definition Object.h:383

References FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::GetValue(), WorldObject::m_serverSideVisibility, SEC_PLAYER, and SERVERSIDE_VISIBILITY_GM.

Referenced by npc_ghostly_priest::npc_ghostly_priestAI::AttackStart(), npc_phantom_mage::npc_phantom_mageAI::AttackStart(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::AttackStart(), npc_spectral_footman::npc_spectral_footmanAI::AttackStart(), npc_tortured_rifleman::npc_tortured_riflemanAI::AttackStart(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::CanAIAttack(), boss_professor_putricide::boss_professor_putricideAI::CanAIAttack(), boss_sindragosa::boss_sindragosaAI::CanAIAttack(), boss_the_lich_king::boss_the_lich_kingAI::CanAIAttack(), SpellInfo::CheckTarget(), AuraEffect::HandlePhase(), Player::IsVisibleGloballyFor(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_sindragosa::boss_sindragosaAI::JustEngagedWith(), Acore::AllFriendlyCreaturesInGrid::operator()(), boss_sapphiron::boss_sapphironAI::Reset(), npc_pos_leader::npc_pos_leaderAI::SetData(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), npc_big_ooze::npc_big_oozeAI::UpdateAI(), and boss_vazruden_the_herald::UpdateAI().

◆ IsWalking()

◆ IsWithinBoundaryRadius()

bool Unit::IsWithinBoundaryRadius ( const Unit obj) const
705{
706 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
707 return false;
708
709 float objBoundaryRadius = std::max(obj->GetBoundaryRadius(), MIN_MELEE_REACH);
710
711 return IsInDist(obj, objBoundaryRadius);
712}
float GetBoundaryRadius() const
Definition Unit.h:821
bool IsInDist(float x, float y, float z, float dist) const
Definition Position.h:221

References GetBoundaryRadius(), WorldObject::InSamePhase(), Position::IsInDist(), WorldObject::IsInMap(), and MIN_MELEE_REACH.

Referenced by Spell::CheckRange(), Acore::WorldObjectSpellConeTargetCheck::operator()(), and Player::Update().

◆ IsWithinCombatRange()

bool Unit::IsWithinCombatRange ( Unit const *  obj,
float  dist2compare 
) const

◆ IsWithinMeleeRange()

bool Unit::IsWithinMeleeRange ( Unit const *  obj,
float  dist = 0.f 
) const
666{
667 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
668 return false;
669
670 float dx = GetPositionX() - obj->GetPositionX();
671 float dy = GetPositionY() - obj->GetPositionY();
672 float dz = GetPositionZ() - obj->GetPositionZ();
673 float distsq = dx * dx + dy * dy + dz * dz;
674
675 float maxdist = dist + GetMeleeRange(obj);
676
677 if ((IsPlayer() || obj->IsPlayer()) && HasLeewayMovement() && obj->HasLeewayMovement())
678 maxdist += LEEWAY_BONUS_RANGE;
679
680 return distsq < maxdist * maxdist;
681}
#define LEEWAY_BONUS_RANGE
Definition ObjectDefines.h:52
bool HasLeewayMovement() const
Definition Unit.h:1642

References GetMeleeRange(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasLeewayMovement(), WorldObject::InSamePhase(), WorldObject::IsInMap(), Object::IsPlayer(), and LEEWAY_BONUS_RANGE.

Referenced by boss_marli::_chargePlayer(), boss_swamplord_muselek::AttackStart(), SmartAI::AttackStart(), boss_ragnaros::boss_ragnarosAI::CanAIAttack(), boss_ouro::CanAIAttack(), boss_murmur::CanAIAttack(), boss_alar::CanAIAttack(), PetAI::CanAttack(), Spell::CheckRange(), UnitAI::DoMeleeAttackIfReady(), boss_mandokir::boss_mandokirAI::DoMeleeAttackIfReady(), boss_ambassador_hellmaw::DoMeleeAttackIfReady(), ChaseMovementGenerator< T >::DoUpdate(), spell_shazzrah_gate_dummy::FilterTargets(), boss_supremus::FindHatefulStrikeTarget(), boss_ouro::IsPlayerWithinMeleeRange(), boss_ragnaros::boss_ragnarosAI::IsVictimWithinMeleeRange(), boss_swamplord_muselek::JustEngagedWith(), boss_vem::JustEngagedWith(), CreatureAI::MoveCircleChecks(), boss_twin_valkyrAI::myDoMeleeAttackIfReady(), SpellTargetSelector::operator()(), MysticBuffetTargetFilter::operator()(), SmartScript::ProcessEvent(), ThreatContainer::SelectNextVictim(), boss_murmur::ShouldCastResonance(), boss_quartermaster_zigris::SpellHitTarget(), Player::Update(), boss_quartermaster_zigris::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), boss_skeram::UpdateAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), boss_marwyn::boss_marwynAI::UpdateAI(), npc_hor_lumbering_abomination::npc_hor_lumbering_abominationAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_darnavan::npc_darnavanAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_blazing_skeleton::npc_blazing_skeletonAI::UpdateAI(), boss_gluth::boss_gluthAI::UpdateAI(), boss_patchwerk::boss_patchwerkAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), npc_ulduar_dark_rune_guardian::npc_ulduar_dark_rune_guardianAI::UpdateAI(), npc_ulduar_dark_rune_sentinel::npc_ulduar_dark_rune_sentinelAI::UpdateAI(), boss_skarvald_the_constructor::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), boss_lady_vashj::UpdateAI(), boss_the_lurker_below::UpdateAI(), boss_omor_the_unscarred::UpdateAI(), PetAI::UpdateAI(), npc_dark_fiend::UpdateAI(), npc_zuljin_vortex::UpdateAI(), npc_suppresser::npc_suppresserAI::UpdateAI(), and boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::UpdateAI().

◆ IsWithinRange()

bool Unit::IsWithinRange ( Unit const *  obj,
float  dist 
) const
690{
691 if (!obj || !IsInMap(obj) || !InSamePhase(obj))
692 {
693 return false;
694 }
695
696 auto dx = GetPositionX() - obj->GetPositionX();
697 auto dy = GetPositionY() - obj->GetPositionY();
698 auto dz = GetPositionZ() - obj->GetPositionZ();
699 auto distsq = dx * dx + dy * dy + dz * dz;
700
701 return distsq <= dist * dist;
702}

References Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::InSamePhase(), and WorldObject::IsInMap().

Referenced by boss_swamplord_muselek::CanShootVictim(), npc_sunblade_scout::JustEngagedWith(), and npc_amanishi_scout::JustEngagedWith().

◆ JumpTo() [1/2]

void Unit::JumpTo ( float  speedXY,
float  speedZ,
bool  forward = true 
)
19344{
19345 float angle = forward ? 0 : M_PI;
19346 if (IsCreature())
19347 GetMotionMaster()->MoveJumpTo(angle, speedXY, speedZ);
19348 else
19349 {
19350 float vcos = cos(angle + GetOrientation());
19351 float vsin = std::sin(angle + GetOrientation());
19352
19353 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19354 data << GetPackGUID();
19355 data << uint32(0); // Sequence
19356 data << float(vcos); // x direction
19357 data << float(vsin); // y direction
19358 data << float(speedXY); // Horizontal speed
19359 data << float(-speedZ); // Z Movement speed (vertical)
19360
19361 ToPlayer()->GetSession()->SendPacket(&data);
19362 }
19363}
void MoveJumpTo(float angle, float speedXY, float speedZ)
The unit will jump in a specific direction.
Definition MotionMaster.cpp:587
WorldSession * GetSession() const
Definition Player.h:2012
void SendPacket(WorldPacket const *packet)
Send a packet to the client.
Definition WorldSession.cpp:251
@ SMSG_MOVE_KNOCK_BACK
Definition Opcodes.h:269

References GetMotionMaster(), Position::GetOrientation(), Object::GetPackGUID(), Player::GetSession(), Object::IsCreature(), MotionMaster::MoveJumpTo(), WorldSession::SendPacket(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by Spell::EffectLeapBack().

◆ JumpTo() [2/2]

void Unit::JumpTo ( WorldObject obj,
float  speedZ 
)
19366{
19367 float x, y, z;
19368 obj->GetContactPoint(this, x, y, z);
19369 float speedXY = GetExactDist2d(x, y) * 10.0f / speedZ;
19370 GetMotionMaster()->MoveJump(x, y, z, speedXY, speedZ);
19371}
void MoveJump(Position const &pos, float speedXY, float speedZ, uint32 id=0)
Definition MotionMaster.h:229
void GetContactPoint(WorldObject const *obj, float &x, float &y, float &z, float distance2d=CONTACT_DISTANCE) const
Definition Object.cpp:2751

References WorldObject::GetContactPoint(), Position::GetExactDist2d(), GetMotionMaster(), and MotionMaster::MoveJump().

◆ Kill()

void Unit::Kill ( Unit killer,
Unit victim,
bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
static
Todo:
: do instance binding anyway if the charmer/owner is offline
17789{
17790 // Prevent killing unit twice (and giving reward from kill twice)
17791 if (!victim->GetHealth())
17792 return;
17793
17794 if (killer && !killer->IsInMap(victim))
17795 killer = nullptr;
17796
17797 // find player: owner of controlled `this` or `this` itself maybe
17798 Player* player = killer ? killer->GetCharmerOrOwnerPlayerOrPlayerItself() : nullptr;
17799 Creature* creature = victim->ToCreature();
17800
17801 bool isRewardAllowed = true;
17802 if (creature)
17803 {
17804 isRewardAllowed = (creature->IsDamageEnoughForLootingAndReward() && !creature->IsLootRewardDisabled());
17805 if (!isRewardAllowed)
17806 creature->SetLootRecipient(nullptr);
17807 }
17808
17809 // pussywizard: remade this if section (player is on the same map
17810 if (isRewardAllowed && creature)
17811 {
17812 Player* lr = creature->GetLootRecipient();
17813 if (lr && lr->IsInMap(creature))
17814 player = creature->GetLootRecipient();
17815 else if (Group* lrg = creature->GetLootRecipientGroup())
17816 for (GroupReference* itr = lrg->GetFirstMember(); itr != nullptr; itr = itr->next())
17817 if (Player* member = itr->GetSource())
17818 if (member->IsAtLootRewardDistance(creature))
17819 {
17820 player = member;
17821 break;
17822 }
17823 }
17824
17825 // Exploit fix
17826 if (creature && creature->IsPet() && creature->GetOwnerGUID().IsPlayer())
17827 isRewardAllowed = false;
17828
17829 // Reward player, his pets, and group/raid members
17830 // call kill spell proc event (before real die and combat stop to triggering auras removed at death/combat stop)
17831 if (isRewardAllowed && player && player != victim)
17832 {
17833 WorldPacket data(SMSG_PARTYKILLLOG, (8 + 8)); // send event PARTY_KILL
17834 data << player->GetGUID(); // player with killing blow
17835 data << victim->GetGUID(); // victim
17836
17837 Player* looter = player;
17838 Group* group = player->GetGroup();
17839 bool hasLooterGuid = false;
17840
17841 if (group)
17842 {
17843 group->BroadcastPacket(&data, group->GetMemberGroup(player->GetGUID()));
17844
17845 if (creature)
17846 {
17847 group->UpdateLooterGuid(creature, true);
17848 if (group->GetLooterGuid() && group->GetLootMethod() != FREE_FOR_ALL)
17849 {
17850 looter = ObjectAccessor::FindPlayer(group->GetLooterGuid());
17851 if (looter)
17852 {
17853 hasLooterGuid = true;
17854 creature->SetLootRecipient(looter); // update creature loot recipient to the allowed looter.
17855 }
17856 }
17857 }
17858 }
17859 else
17860 {
17861 player->SendDirectMessage(&data);
17862
17863 if (creature)
17864 {
17865 WorldPacket data2(SMSG_LOOT_LIST, 8 + 1 + 1);
17866 data2 << creature->GetGUID();
17867 data2 << uint8(0); // unk1
17868 data2 << uint8(0); // no group looter
17869 player->SendMessageToSet(&data2, true);
17870 }
17871 }
17872
17873 // Generate loot before updating looter
17874 if (creature)
17875 {
17876 Loot* loot = &creature->loot;
17877 loot->clear();
17878
17879 if (uint32 lootid = creature->GetCreatureTemplate()->lootid)
17880 loot->FillLoot(lootid, LootTemplates_Creature, looter, false, false, creature->GetLootMode(), creature);
17881
17882 if (creature->GetLootMode())
17884
17885 if (group)
17886 {
17887 if (hasLooterGuid)
17888 group->SendLooter(creature, looter);
17889 else
17890 group->SendLooter(creature, nullptr);
17891
17892 // Update round robin looter only if the creature had loot
17893 if (!creature->loot.empty())
17894 group->UpdateLooterGuid(creature);
17895 }
17896 }
17897
17898 player->RewardPlayerAndGroupAtKill(victim, false);
17899 }
17900
17901 // Do KILL and KILLED procs. KILL proc is called only for the unit who landed the killing blow (and its owner - for pets and totems) regardless of who tapped the victim
17902 if (killer && (killer->IsPet() || killer->IsTotem()))
17903 if (Unit* owner = killer->GetOwner())
17904 {
17905 Unit::ProcDamageAndSpell(owner, victim, PROC_FLAG_KILL, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17906 sScriptMgr->OnPlayerCreatureKilledByPet( killer->GetCharmerOrOwnerPlayerOrPlayerItself(), victim->ToCreature());
17907 }
17908
17909 if (killer != victim)
17910 {
17911 Unit::ProcDamageAndSpell(killer, victim, killer ? PROC_FLAG_KILL : 0, PROC_FLAG_KILLED, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17912 }
17913
17914 // Proc auras on death - must be before aura/combat remove
17915 Unit::ProcDamageAndSpell(victim, nullptr, PROC_FLAG_DEATH, PROC_FLAG_NONE, PROC_EX_NONE, 0, attackType, spellProto, nullptr, -1, spell);
17916
17917 // update get killing blow achievements, must be done before setDeathState to be able to require auras on target
17918 // and before Spirit of Redemption as it also removes auras
17919 if (killer)
17920 if (Player* killerPlayer = killer->GetCharmerOrOwnerPlayerOrPlayerItself())
17921 killerPlayer->UpdateAchievementCriteria(ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, 1, 0, victim);
17922
17923 // Spirit of Redemption
17924 // if talent known but not triggered (check priest class for speedup check)
17925 bool spiritOfRedemption = false;
17927 {
17928 if (AuraEffect* aurEff = victim->GetAuraEffectDummy(20711))
17929 {
17930 // Xinef: aura_spirit_of_redemption is triggered by 27827 shapeshift
17931 if (victim->HasSpiritOfRedemptionAura() || victim->HasAura(27827))
17932 {
17933 /*LOG_INFO("misc", "Player ({}) died with spirit of redemption. Killer (Entry: {}, Name: {}), Map: {}, x: {}, y: {}, z: {}",
17934 victim->GetGUID().ToString(), killer ? killer->GetEntry() : 1, killer ? killer->GetName() : "", victim->GetMapId(), victim->GetPositionX(),
17935 victim->GetPositionY(), victim->GetPositionZ());
17936
17937 ACE_Stack_Trace trace(0, 50);
17938 LOG_INFO("misc", "TRACE: {}\n\n", trace);*/
17939 }
17940 else
17941 {
17942 // save value before aura remove
17943 uint32 ressSpellId = victim->GetUInt32Value(PLAYER_SELF_RES_SPELL);
17944 if (!ressSpellId)
17945 ressSpellId = victim->ToPlayer()->GetResurrectionSpellId();
17946
17947 //Remove all expected to remove at death auras (most important negative case like DoT or periodic triggers)
17948 victim->RemoveAllAurasOnDeath();
17949
17950 // Stop attacks
17951 victim->CombatStop();
17953
17954 // restore for use at real death
17955 victim->SetUInt32Value(PLAYER_SELF_RES_SPELL, ressSpellId);
17956
17957 // FORM_SPIRITOFREDEMPTION and related auras
17958 victim->CastSpell(victim, 27827, true, nullptr, aurEff);
17959 spiritOfRedemption = true;
17960 }
17961 }
17962 }
17963
17964 if (!spiritOfRedemption)
17965 {
17966 LOG_DEBUG("entities.unit", "SET DeathState::JustDied");
17968 }
17969
17970 // Inform pets (if any) when player kills target)
17971 // MUST come after victim->setDeathState(DeathState::JustDied); or pet next target
17972 // selection will get stuck on same target and break pet react state
17973 if (player)
17974 {
17975 Pet* pet = player->GetPet();
17976 if (pet && pet->IsAlive() && pet->isControlled())
17977 pet->AI()->KilledUnit(victim);
17978 }
17979
17980 // 10% durability loss on death
17981 // clean InHateListOf
17982 if (Player* plrVictim = victim->ToPlayer())
17983 {
17984 // remember victim PvP death for corpse type and corpse reclaim delay
17985 // at original death (not at SpiritOfRedemtionTalent timeout)
17986 plrVictim->SetPvPDeath(player != nullptr);
17987
17988 // only if not player and not controlled by player pet. And not at BG
17989 if ((durabilityLoss && !player && !plrVictim->InBattleground()) || (player && sWorld->getBoolConfig(CONFIG_DURABILITY_LOSS_IN_PVP)))
17990 {
17991 LOG_DEBUG("entities.unit", "We are dead, losing {} percent durability", sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f);
17992 plrVictim->DurabilityLossAll(sWorld->getRate(RATE_DURABILITY_LOSS_ON_DEATH) / 100.0f, false);
17993 // durability lost message
17994 plrVictim->SendDurabilityLoss();
17995 }
17996 // Call KilledUnit for creatures
17997 if (killer && killer->IsCreature() && killer->IsAIEnabled)
17998 killer->ToCreature()->AI()->KilledUnit(victim);
17999
18000 // last damage from non duel opponent or opponent controlled creature
18001 if (plrVictim->duel)
18002 {
18003 plrVictim->duel->Opponent->CombatStopWithPets(true);
18004 plrVictim->CombatStopWithPets(true);
18005 plrVictim->DuelComplete(DUEL_INTERRUPTED);
18006 }
18007 }
18008 else // creature died
18009 {
18010 LOG_DEBUG("entities.unit", "DealDamageNotPlayer");
18011
18012 if (!creature->IsPet() && creature->GetLootMode() > 0)
18013 {
18014 creature->GetThreatMgr().ClearAllThreat();
18015
18016 // must be after setDeathState which resets dynamic flags
18017 if (!creature->loot.isLooted())
18018 {
18020 }
18021 else
18022 {
18023 creature->AllLootRemovedFromCorpse();
18024 }
18025 }
18026
18027 // Call KilledUnit for creatures, this needs to be called after the lootable flag is set
18028 if (killer && killer->IsCreature() && killer->IsAIEnabled)
18029 killer->ToCreature()->AI()->KilledUnit(victim);
18030
18031 // Call creature just died function
18032 if (CreatureAI* ai = creature->AI())
18033 {
18034 ai->JustDied(killer);
18035 }
18036
18037 if (TempSummon* summon = creature->ToTempSummon())
18038 {
18039 if (WorldObject* summoner = summon->GetSummoner())
18040 {
18041 if (summoner->ToCreature() && summoner->ToCreature()->IsAIEnabled)
18042 {
18043 summoner->ToCreature()->AI()->SummonedCreatureDies(creature, killer);
18044 }
18045 else if (summoner->ToGameObject() && summoner->ToGameObject()->AI())
18046 {
18047 summoner->ToGameObject()->AI()->SummonedCreatureDies(creature, killer);
18048 }
18049 }
18050 }
18051
18052 // Dungeon specific stuff, only applies to players killing creatures
18053 if (creature->GetInstanceId())
18054 {
18055 Map* instanceMap = creature->GetMap();
18056 //Player* creditedPlayer = GetCharmerOrOwnerPlayerOrPlayerItself();
18058
18059 if (instanceMap->IsDungeon() && player)
18060 if (instanceMap->IsRaidOrHeroicDungeon())
18062 instanceMap->ToInstanceMap()->PermBindAllPlayers();
18063 }
18064 }
18065
18066 // outdoor pvp things, do these after setting the death state, else the player activity notify won't work... doh...
18067 // handle player kill only if not suicide (spirit of redemption for example)
18068 if (player && killer != victim)
18069 {
18070 if (OutdoorPvP* pvp = player->GetOutdoorPvP())
18071 pvp->HandleKill(player, victim);
18072
18073 if (Battlefield* bf = sBattlefieldMgr->GetBattlefieldToZoneId(player->GetZoneId()))
18074 bf->HandleKill(player, victim);
18075 }
18076
18077 //if (victim->IsPlayer())
18078 // if (OutdoorPvP* pvp = victim->ToPlayer()->GetOutdoorPvP())
18079 // pvp->HandlePlayerActivityChangedpVictim->ToPlayer();
18080
18081 // battleground things (do this at the end, so the death state flag will be properly set to handle in the bg->handlekill)
18082 if (player)
18083 if (Battleground* bg = player->GetBattleground())
18084 {
18085 if (victim->IsPlayer())
18086 bg->HandleKillPlayer(victim->ToPlayer(), player);
18087 else
18088 bg->HandleKillUnit(victim->ToCreature(), player);
18089 }
18090
18091 // achievement stuff
18092 if (killer && victim->IsPlayer())
18093 {
18094 if (killer->IsCreature())
18096 else if (victim != killer && killer->IsPlayer())
18098 }
18099
18100 // Hook for OnPVPKill Event
18101 if (killer)
18102 {
18103 if (Player* killerPlr = killer->ToPlayer())
18104 {
18105 if (Player* killedPlr = victim->ToPlayer())
18106 sScriptMgr->OnPlayerPVPKill(killerPlr, killedPlr);
18107 else if (Creature* killedCre = victim->ToCreature())
18108 sScriptMgr->OnPlayerCreatureKill(killerPlr, killedCre);
18109 }
18110 else if (Creature* killerCre = killer->ToCreature())
18111 {
18112 if (Player* killed = victim->ToPlayer())
18113 sScriptMgr->OnPlayerKilledByCreature(killerCre, killed);
18114 }
18115 }
18116
18117 sScriptMgr->OnUnitDeath(victim, killer);
18118}
#define sBattlefieldMgr
Definition BattlefieldMgr.h:77
@ CREATURE_FLAG_EXTRA_INSTANCE_BIND
Definition CreatureData.h:45
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER
Definition DBCEnums.h:138
@ ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE
Definition DBCEnums.h:137
@ ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS
Definition DBCEnums.h:170
LootStore LootTemplates_Creature("creature_loot_template", "creature entry", true)
@ FREE_FOR_ALL
Definition LootMgr.h:58
@ PLAYER_FLAGS_IS_OUT_OF_BOUNDS
Definition Player.h:494
@ UNIT_DYNFLAG_LOOTABLE
Definition SharedDefines.h:3360
@ DUEL_INTERRUPTED
Definition SharedDefines.h:3867
@ PROC_FLAG_KILLED
Definition SpellMgr.h:107
@ PLAYER_SELF_RES_SPELL
Definition UpdateFields.h:370
@ RATE_DURABILITY_LOSS_ON_DEATH
Definition WorldConfig.h:467
@ CONFIG_DURABILITY_LOSS_IN_PVP
Definition WorldConfig.h:25
Definition Battlefield.h:204
Definition CreatureAI.h:70
virtual void KilledUnit(Unit *)
Definition CreatureAI.h:131
Loot loot
Definition Creature.h:230
uint16 GetLootMode() const
Definition Creature.h:244
void AllLootRemovedFromCorpse()
Definition Creature.cpp:3005
bool IsLootRewardDisabled() const
Definition Creature.h:366
Player * GetLootRecipient() const
Definition Creature.cpp:1317
bool IsDamageEnoughForLootingAndReward() const
Definition Creature.cpp:3828
Group * GetLootRecipientGroup() const
Definition Creature.cpp:1324
GroupReference * next()
Definition GroupReference.h:36
void BroadcastPacket(WorldPacket const *packet, bool ignorePlayersInBGRaid, int group=-1, ObjectGuid ignore=ObjectGuid::Empty)
Definition Group.cpp:1756
uint8 GetMemberGroup(ObjectGuid guid) const
Definition Group.cpp:2383
ObjectGuid GetLooterGuid() const
Definition Group.cpp:2320
LootMethod GetLootMethod() const
Definition Group.cpp:2315
void UpdateLooterGuid(WorldObject *pLootedObject, bool ifneed=false)
Definition Group.cpp:1867
void SendLooter(Creature *creature, Player *pLooter)
Definition Group.cpp:966
void PermBindAllPlayers()
Definition Map.cpp:2227
Definition Map.h:158
bool IsRaidOrHeroicDungeon() const
Definition Map.h:293
InstanceMap * ToInstanceMap()
Definition Map.h:383
virtual void SetDynamicFlag(uint32 flag)
Definition Object.h:124
Definition OutdoorPvP.h:186
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:5733
TeamId GetTeamId(bool original=false) const
Definition Player.h:2123
Battleground * GetBattleground(bool create=false) const
Definition Player.cpp:12173
uint32 GetResurrectionSpellId()
Definition Player.cpp:12589
OutdoorPvP * GetOutdoorPvP() const
Definition Player.cpp:12490
void RewardPlayerAndGroupAtKill(Unit *victim, bool isBattleGround)
Definition Player.cpp:12703
void RemoveAllAurasOnDeath()
Definition Unit.cpp:5405
AuraEffect * GetAuraEffectDummy(uint32 spellid) const
Definition Unit.cpp:5606
uint32 GetInstanceId() const
Definition Object.h:499
uint32 GetZoneId() const
Definition Object.cpp:3144
@ SMSG_PARTYKILLLOG
Definition Opcodes.h:531
@ SMSG_LOOT_LIST
Definition Opcodes.h:1047
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:245
uint32 mingold
Definition CreatureData.h:231
uint32 maxgold
Definition CreatureData.h:232
uint32 lootid
Definition CreatureData.h:224
Definition LootMgr.h:313
bool empty() const
Definition LootMgr.h:367
bool isLooted() const
Definition LootMgr.h:368
void clear()
Definition LootMgr.h:343
void generateMoneyLoot(uint32 minAmount, uint32 maxAmount)
Definition LootMgr.cpp:838
bool FillLoot(uint32 lootId, LootStore const &store, Player *lootOwner, bool personal, bool noEmptyError=false, uint16 lootMode=LOOT_MODE_DEFAULT, WorldObject *lootSource=nullptr)
Definition LootMgr.cpp:571

References ACHIEVEMENT_CRITERIA_TYPE_GET_KILLING_BLOWS, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_CREATURE, ACHIEVEMENT_CRITERIA_TYPE_KILLED_BY_PLAYER, Creature::AI(), Creature::AllLootRemovedFromCorpse(), Group::BroadcastPacket(), CastSpell(), CLASS_CONTEXT_ABILITY, CLASS_PRIEST, Loot::clear(), ThreatMgr::ClearAllThreat(), CombatStop(), CONFIG_DURABILITY_LOSS_IN_PVP, CREATURE_FLAG_EXTRA_INSTANCE_BIND, HostileRefMgr::deleteReferences(), DUEL_INTERRUPTED, Loot::empty(), Loot::FillLoot(), ObjectAccessor::FindPlayer(), FREE_FOR_ALL, Loot::generateMoneyLoot(), GetAuraEffectDummy(), Player::GetBattleground(), GetCharmerOrOwnerPlayerOrPlayerItself(), Creature::GetCreatureTemplate(), Object::GetEntry(), Player::GetGroup(), Object::GetGUID(), GetHealth(), getHostileRefMgr(), WorldObject::GetInstanceId(), Group::GetLooterGuid(), Group::GetLootMethod(), Creature::GetLootMode(), Creature::GetLootRecipient(), Creature::GetLootRecipientGroup(), WorldObject::GetMap(), Group::GetMemberGroup(), Player::GetOutdoorPvP(), GetOwner(), GetOwnerGUID(), Player::GetPet(), Player::GetResurrectionSpellId(), Player::GetTeamId(), GetThreatMgr(), Object::GetUInt32Value(), WorldObject::GetZoneId(), HasAura(), Creature::HasFlagsExtra(), Player::HasPlayerFlag(), HasSpiritOfRedemptionAura(), Player::InBattleground(), IsAIEnabled, IsAlive(), IsClass(), Pet::isControlled(), Object::IsCreature(), Creature::IsDamageEnoughForLootingAndReward(), Map::IsDungeon(), WorldObject::IsInMap(), Loot::isLooted(), Creature::IsLootRewardDisabled(), IsPet(), Object::IsPlayer(), ObjectGuid::IsPlayer(), Map::IsRaidOrHeroicDungeon(), IsTotem(), JustDied, CreatureAI::KilledUnit(), LOG_DEBUG, Creature::loot, CreatureTemplate::lootid, LootTemplates_Creature, CreatureTemplate::maxgold, CreatureTemplate::mingold, GroupReference::next(), InstanceMap::PermBindAllPlayers(), PLAYER_FLAGS_IS_OUT_OF_BOUNDS, PLAYER_SELF_RES_SPELL, PROC_EX_NONE, PROC_FLAG_DEATH, PROC_FLAG_KILL, PROC_FLAG_KILLED, PROC_FLAG_NONE, ProcDamageAndSpell(), RATE_DURABILITY_LOSS_ON_DEATH, RemoveAllAurasOnDeath(), Player::RewardPlayerAndGroupAtKill(), sBattlefieldMgr, Player::SendDirectMessage(), Group::SendLooter(), Player::SendMessageToSet(), setDeathState(), Object::SetDynamicFlag(), Creature::SetLootRecipient(), SetUInt32Value(), SMSG_LOOT_LIST, SMSG_PARTYKILLLOG, sScriptMgr, sWorld, Object::ToCreature(), Map::ToInstanceMap(), Object::ToPlayer(), ToTempSummon(), UNIT_DYNFLAG_LOOTABLE, Player::UpdateAchievementCriteria(), and Group::UpdateLooterGuid().

Referenced by boss_headless_horseman_head::DamageTaken(), boss_viscidus::DamageTaken(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::DamageTaken(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::DamageTaken(), DealDamage(), boss_jedoga_shadowseeker::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_illidari_council::DoAction(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), DeathEvent::Execute(), BattlegroundIC::HandleCapturedNodes(), misc_commandscript::HandleDieCommand(), spell_ooze_zap_channel_end::HandleDummy(), spell_pos_rimefang_frost_nova::HandleDummy(), spell_q12589_shoot_rjr::HandleDummy(), spell_item_chicken_cover::HandleDummy(), spell_yogg_saron_titanic_storm::HandleDummyEffect(), spell_item_rocket_chicken::HandleDummyTick(), spell_ulduar_arachnopod_damaged_aura::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_teron_gorefiend_spiritual_vengeance::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), spell_voa_overcharge_aura::HandlePeriodicDummy(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_leotheras_clear_consuming_madness::HandleScriptEffect(), boss_twin_valkyrAI::JustDied(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_sister_svalna::boss_sister_svalnaAI::JustDied(), boss_ignis::boss_ignisAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), boss_ahune::JustDied(), npc_frozen_core::JustDied(), boss_twinemperorsAI::JustDied(), boss_halion::boss_halionAI::JustDied(), boss_twilight_halion::boss_twilight_halionAI::JustDied(), KillSelf(), boss_buru::ManipulateEggs(), npc_burning_spirit::npc_burning_spiritAI::MovementInform(), spell_q12779_an_end_to_all_things_devour_aura::OnRemove(), spell_yogg_saron_insane_aura::OnRemove(), WretchedGhoulCleaner::operator()(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::PassengerBoarded(), SmartScript::ProcessAction(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::RandomizeCompositionsAndShow(), npc_cos_stratholme_citizien::npc_cos_stratholme_citizienAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHitTarget(), npc_oculus_drake::npc_oculus_drakeAI::SpellHitTarget(), instance_stratholme::instance_stratholme_InstanceMapScript::Update(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::Update(), instance_trial_of_the_crusader::instance_trial_of_the_crusader_InstanceMapScript::Update(), instance_shattered_halls::instance_shattered_halls_InstanceMapScript::Update(), SimpleCharmedAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_sinkhole_kill_credit::npc_sinkhole_kill_creditAI::UpdateAI(), npc_boneguard_footman::npc_boneguard_footmanAI::UpdateAI(), npc_gunship::npc_gunshipAI::UpdateAI(), and npc_emily::npc_emilyAI::WaypointReached().

◆ KillSelf()

void Unit::KillSelf ( bool  durabilityLoss = true,
WeaponAttackType  attackType = BASE_ATTACK,
SpellInfo const *  spellProto = nullptr,
Spell const *  spell = nullptr 
)
inline
1161{ Kill(this, this, durabilityLoss, attackType, spellProto, spell); };

References Kill().

Referenced by boss_felblood_kaelthas::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_illidari_council::DoAction(), npc_xt002_boombot::npc_xt002_boombotAI::Explode(), npc_raging_flames::FixateRandomTarget(), npc_rancid_mushroom::InitializeAI(), boss_warlord_kalithresh::JustDied(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_pet_gen_plump_turkey::MovementInform(), npc_wild_wyrm::npc_wild_wyrmAI::MovementInform(), npc_announcer_toc5::npc_announcer_toc5AI::MovementInform(), boss_glob_of_viscidus::MovementInform(), SmartScript::ProcessAction(), npc_singularity::Reset(), boss_archimonde::Reset(), npc_necropolis_health::SpellHit(), npc_dark_iron_guzzler::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), npc_necrotic_shard::SpellHit(), boss_victor_nefarius::boss_victor_nefariusAI::SummonedCreatureDies(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDies(), npc_icc_gauntlet_controller::npc_icc_gauntlet_controllerAI::SummonedCreatureDies(), boss_vazruden_the_herald::SummonedCreatureDies(), npc_warden_mellichar::npc_warden_mellicharAI::SummonedCreatureDies(), npc_brewfest_super_brew_trigger::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_sjonnir_malformed_ooze::boss_sjonnir_malformed_oozeAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), and npc_frost_tomb::UpdateAI().

◆ KnockbackFrom()

void Unit::KnockbackFrom ( float  x,
float  y,
float  speedXY,
float  speedZ 
)
19230{
19231 Player* player = ToPlayer();
19232 if (!player)
19233 {
19234 if (Unit* charmer = GetCharmer())
19235 {
19236 player = charmer->ToPlayer();
19237 if (player && player->m_mover != this)
19238 player = nullptr;
19239 }
19240 }
19241
19242 if (!player)
19243 {
19244 GetMotionMaster()->MoveKnockbackFrom(x, y, speedXY, speedZ);
19245 }
19246 else
19247 {
19248 float vcos, vsin;
19249 GetSinCos(x, y, vsin, vcos);
19250
19251 WorldPacket data(SMSG_MOVE_KNOCK_BACK, (8 + 4 + 4 + 4 + 4 + 4));
19252 data << GetPackGUID();
19253 data << uint32(0); // counter
19254 data << float(vcos); // x direction
19255 data << float(vsin); // y direction
19256 data << float(speedXY); // Horizontal speed
19257 data << float(-speedZ); // Z Movement speed (vertical)
19258
19259 player->GetSession()->SendPacket(&data);
19260
19261 if (player->HasIncreaseMountedFlightSpeedAura() || player->HasFlyAura())
19262 player->SetCanFly(true, true);
19263
19264 player->SetCanKnockback(true);
19265 }
19266}
void MoveKnockbackFrom(float srcX, float srcY, float speedXY, float speedZ)
Definition MotionMaster.cpp:558
SafeUnitPointer m_mover
Definition Player.h:2348
void SetCanKnockback(bool value)
Definition Player.h:2515
bool SetCanFly(bool apply, bool packetOnly=false) override
Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pre...
Definition Player.cpp:15895
bool HasFlyAura() const
Definition Unit.h:1717
bool HasIncreaseMountedFlightSpeedAura() const
Definition Unit.h:1744
void GetSinCos(float x, float y, float &vsin, float &vcos) const
Definition Position.cpp:92

References GetCharmer(), GetMotionMaster(), Object::GetPackGUID(), Player::GetSession(), Position::GetSinCos(), HasFlyAura(), HasIncreaseMountedFlightSpeedAura(), Player::m_mover, MotionMaster::MoveKnockbackFrom(), WorldSession::SendPacket(), Player::SetCanFly(), Player::SetCanKnockback(), SMSG_MOVE_KNOCK_BACK, and Object::ToPlayer().

Referenced by _ExitVehicle(), boss_maexxna::boss_maexxnaAI::DoCastWebWrap(), Spell::EffectKnockBack(), spell_warhead_detonate::HandleDummy(), npc_vekjik::OnGossipSelect(), and npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI().

◆ MagicSpellHitResult()

SpellMissInfo Unit::MagicSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3356{
3357 // Can`t miss on dead target (on skinning for example)
3358 if (!victim->IsAlive() && !victim->IsPlayer())
3359 return SPELL_MISS_NONE;
3360
3361 // vehicles cant miss
3362 if (IsVehicle())
3363 return SPELL_MISS_NONE;
3364
3365 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3366 // resist and deflect chances
3367 // xinef: skip all calculations, proof: Toxic Tolerance quest
3368 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3369 return SPELL_MISS_NONE;
3370
3371 if (spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
3372 {
3373 return SPELL_MISS_NONE;
3374 }
3375
3376 SpellSchoolMask schoolMask = spellInfo->GetSchoolMask();
3377 int32 thisLevel = getLevelForTarget(victim);
3378 if (IsCreature() && ToCreature()->IsTrigger())
3379 thisLevel = std::max<int32>(thisLevel, spellInfo->SpellLevel);
3380 int32 levelDiff = int32(victim->getLevelForTarget(this)) - thisLevel;
3381
3382 int32 MISS_CHANCE_MULTIPLIER;
3383 if (sWorld->getBoolConfig(CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS) && !IsPlayer()) // keep it as it was originally (7 and 11)
3384 {
3385 MISS_CHANCE_MULTIPLIER = victim->IsPlayer() ? 7 : 11;
3386 }
3387 else
3388 {
3389 MISS_CHANCE_MULTIPLIER = sWorld->getRate(
3390 victim->IsPlayer()
3393 }
3394
3395 // Base hit chance from attacker and victim levels
3396 int32 modHitChance = levelDiff < 3
3397 ? 96 - levelDiff
3398 : 94 - (levelDiff - 2) * MISS_CHANCE_MULTIPLIER;
3399
3400 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
3401 if (Player* modOwner = GetSpellModOwner())
3402 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_RESIST_MISS_CHANCE, modHitChance);
3403
3404 // Increase from attacker SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT auras
3406
3407 // Spells with SPELL_ATTR3_ALWAYS_HIT will ignore target's avoidance effects
3408 // xinef: imo it should completly ignore all calculations, eg: 14792. Hits 80 level players on blizz without any problems
3409 //if (!spell->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3410 {
3411 // Chance hit from victim SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE auras
3413 // Reduce spell hit chance for Area of effect spells from victim SPELL_AURA_MOD_AOE_AVOIDANCE aura
3414 if (spellInfo->IsAffectingArea())
3415 modHitChance -= victim->GetTotalAuraModifier(SPELL_AURA_MOD_AOE_AVOIDANCE);
3416
3417 // Decrease hit chance from victim rating bonus
3418 if (victim->IsPlayer())
3419 modHitChance -= int32(victim->ToPlayer()->GetRatingBonusValue(CR_HIT_TAKEN_SPELL));
3420 }
3421
3422 int32 HitChance = modHitChance * 100;
3423 // Increase hit chance from attacker SPELL_AURA_MOD_SPELL_HIT_CHANCE and attacker ratings
3424 // Xinef: Totems should inherit casters ratings?
3425 if (IsTotem())
3426 {
3427 if (Unit* owner = GetOwner())
3428 HitChance += int32(owner->m_modSpellHitChance * 100.0f);
3429 }
3430 else
3431 HitChance += int32(m_modSpellHitChance * 100.0f);
3432
3433 if (HitChance < 100)
3434 HitChance = 100;
3435 else if (HitChance > 10000)
3436 HitChance = 10000;
3437
3438 int32 tmp = 10000 - HitChance;
3439
3440 int32 rand = irand(1, 10000); // Needs to be 1 to 10000 to avoid the 1/10000 chance to miss on 100% hit rating
3441
3442 if (rand < tmp)
3443 return SPELL_MISS_MISS;
3444
3445 // Chance resist mechanic (select max value from every mechanic spell effect)
3446 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3447 tmp += resist_chance;
3448
3449 // Chance resist debuff
3450 if (!spellInfo->IsPositive() && !spellInfo->HasAttribute(SPELL_ATTR4_NO_CAST_LOG))
3451 {
3452 bool bNegativeAura = true;
3453 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
3454 {
3455 // Xinef: Check if effect exists!
3456 if (spellInfo->Effects[i].IsEffect() && spellInfo->Effects[i].ApplyAuraName == 0)
3457 {
3458 bNegativeAura = false;
3459 break;
3460 }
3461 }
3462
3463 if (bNegativeAura)
3464 {
3465 tmp += victim->GetMaxPositiveAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3466 tmp += victim->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_DEBUFF_RESISTANCE, int32(spellInfo->Dispel)) * 100;
3467 }
3468
3469 // Players resistance for binary spells
3470 if (spellInfo->HasAttribute(SPELL_ATTR0_CU_BINARY_SPELL) && (spellInfo->GetSchoolMask() & (SPELL_SCHOOL_MASK_NORMAL | SPELL_SCHOOL_MASK_HOLY)) == 0)
3471 tmp += int32(Unit::GetEffectiveResistChance(this, spellInfo->GetSchoolMask(), victim) * 10000.0f); // 100 for spell calculations, and 100 for return value percentage
3472 }
3473
3474 // Roll chance
3475 if (rand < tmp)
3476 return SPELL_MISS_RESIST;
3477
3478 // cast by caster in front of victim
3479 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3480 {
3481 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3482 tmp += deflect_chance;
3483 if (rand < tmp)
3484 return SPELL_MISS_DEFLECT;
3485 }
3486
3487 return SPELL_MISS_NONE;
3488}
@ SPELL_ATTR7_NO_ATTACK_MISS
Definition SharedDefines.h:666
@ SPELL_MISS_NONE
Definition SharedDefines.h:1519
@ SPELL_MISS_RESIST
Definition SharedDefines.h:1521
@ SPELL_MISS_MISS
Definition SharedDefines.h:1520
@ SPELL_MISS_DEFLECT
Definition SharedDefines.h:1528
@ SPELL_AURA_MOD_DEBUFF_RESISTANCE
Definition SpellAuraDefines.h:241
@ SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT
Definition SpellAuraDefines.h:262
@ SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE
Definition SpellAuraDefines.h:249
@ SPELL_AURA_MOD_AOE_AVOIDANCE
Definition SpellAuraDefines.h:223
@ SPELLMOD_RESIST_MISS_CHANCE
Definition SpellDefines.h:92
@ CR_HIT_TAKEN_SPELL
Definition Unit.h:231
@ CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS
Definition WorldConfig.h:130
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER
Definition WorldConfig.h:475
@ RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE
Definition WorldConfig.h:474
float GetRatingBonusValue(CombatRating cr) const
Definition Player.cpp:5226
int32 GetMaxNegativeAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6139
int32 GetMaxPositiveAuraModifierByMiscValue(AuraType auratype, int32 misc_value) const
Definition Unit.cpp:6125
int32 GetMechanicResistChance(SpellInfo const *spell)
Definition Unit.cpp:3161

References CONFIG_MISS_CHANCE_MULTIPLIER_ONLY_FOR_PLAYERS, CR_HIT_TAKEN_SPELL, SpellInfo::Dispel, SpellInfo::Effects, GetEffectiveResistChance(), getLevelForTarget(), GetMaxNegativeAuraModifierByMiscValue(), GetMaxPositiveAuraModifierByMiscValue(), GetMechanicResistChance(), GetOwner(), Player::GetRatingBonusValue(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, irand(), SpellInfo::IsAffectingArea(), IsAlive(), Object::IsCreature(), Object::IsPlayer(), SpellInfo::IsPositive(), IsTotem(), IsVehicle(), m_modSpellHitChance, MAX_SPELL_EFFECTS, RATE_MISS_CHANCE_MULTIPLIER_TARGET_CREATURE, RATE_MISS_CHANCE_MULTIPLIER_TARGET_PLAYER, SPELL_ATTR0_CU_BINARY_SPELL, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR4_NO_CAST_LOG, SPELL_ATTR7_NO_ATTACK_MISS, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_MOD_AOE_AVOIDANCE, SPELL_AURA_MOD_ATTACKER_SPELL_HIT_CHANCE, SPELL_AURA_MOD_DEBUFF_RESISTANCE, SPELL_AURA_MOD_INCREASES_SPELL_PCT_TO_HIT, SPELL_MISS_DEFLECT, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_RESIST, SPELL_SCHOOL_MASK_HOLY, SPELL_SCHOOL_MASK_NORMAL, SpellInfo::SpellLevel, SPELLMOD_RESIST_MISS_CHANCE, sWorld, Object::ToCreature(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeDamageBonusDone()

uint32 Unit::MeleeDamageBonusDone ( Unit pVictim,
uint32  damage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13158{
13159 if (!victim || pdamage == 0)
13160 return 0;
13161
13162 if (IsCreature())
13163 {
13164 // Dancing Rune Weapon...
13165 if (GetEntry() == 27893)
13166 {
13167 if (Unit* owner = GetOwner())
13168 return owner->MeleeDamageBonusDone(victim, pdamage, attType, spellProto, damageSchoolMask) / 2;
13169 }
13170 }
13171
13172 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
13173
13174 // Done fixed damage bonus auras
13175 int32 DoneFlatBenefit = 0;
13176
13177 // ..done
13179 for (AuraEffectList::const_iterator i = mDamageDoneCreature.begin(); i != mDamageDoneCreature.end(); ++i)
13180 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13181 DoneFlatBenefit += (*i)->GetAmount();
13182
13183 // ..done
13184 // SPELL_AURA_MOD_DAMAGE_DONE included in weapon damage
13185
13186 // ..done (base at attack power for marked target and base at attack power for creature type)
13187 int32 APbonus = 0;
13188
13189 if (attType == RANGED_ATTACK)
13190 {
13191 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS);
13192
13193 // ..done (base at attack power and creature type)
13195 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13196 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13197 APbonus += (*i)->GetAmount();
13198 }
13199 else
13200 {
13201 APbonus += victim->GetTotalAuraModifier(SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS);
13202
13203 // ..done (base at attack power and creature type)
13205 for (AuraEffectList::const_iterator i = mCreatureAttackPower.begin(); i != mCreatureAttackPower.end(); ++i)
13206 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13207 APbonus += (*i)->GetAmount();
13208 }
13209
13210 if (APbonus != 0) // Can be negative
13211 {
13212 bool normalized = false;
13213 if (spellProto)
13214 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
13215 if (spellProto->Effects[i].Effect == SPELL_EFFECT_NORMALIZED_WEAPON_DMG)
13216 {
13217 normalized = true;
13218 break;
13219 }
13220 DoneFlatBenefit += int32(APbonus / 14.0f * GetAPMultiplier(attType, normalized));
13221 }
13222
13223 // Done total percent damage auras
13224 float DoneTotalMod = 1.0f;
13225
13226 // mods for SPELL_SCHOOL_MASK_NORMAL are already factored in base melee damage calculation
13227 if (!(damageSchoolMask & SPELL_SCHOOL_MASK_NORMAL))
13228 {
13229 // Some spells don't benefit from pct done mods
13231 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
13232 {
13233 if (!spellProto || (spellProto->ValidateAttribute6SpellDamageMods(this, *i, false) &&
13234 sScriptMgr->IsNeedModMeleeDamagePercent(this, *i, DoneTotalMod, spellProto)))
13235 {
13236 if (((*i)->GetMiscValue() & damageSchoolMask))
13237 {
13238 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
13239 AddPct(DoneTotalMod, (*i)->GetAmount());
13240 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
13241 AddPct(DoneTotalMod, (*i)->GetAmount());
13242 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
13243 AddPct(DoneTotalMod, (*i)->GetAmount());
13244 }
13245 }
13246 }
13247 }
13248
13250 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
13251 if (creatureTypeMask & uint32((*i)->GetMiscValue()))
13252 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13253 AddPct(DoneTotalMod, (*i)->GetAmount());
13254
13255 // bonus against aurastate
13257 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
13258 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())))
13259 if (!spellProto || spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13260 AddPct(DoneTotalMod, (*i)->GetAmount());
13261
13262 // done scripted mod (take it from owner)
13263 Unit* owner = GetOwner() ? GetOwner() : this;
13264 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13265 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
13266 {
13267 if (spellProto && !spellProto->ValidateAttribute6SpellDamageMods(this, *i, false))
13268 continue;
13269
13270 if (!(*i)->IsAffectedOnSpell(spellProto))
13271 continue;
13272
13273 switch ((*i)->GetMiscValue())
13274 {
13275 // Tundra Stalker
13276 // Merciless Combat
13277 case 7277:
13278 {
13279 // Merciless Combat
13280 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
13281 {
13282 if (!victim->HealthAbovePct(35))
13283 AddPct(DoneTotalMod, (*i)->GetAmount());
13284 }
13285 // Tundra Stalker
13286 else
13287 {
13288 // Frost Fever (target debuff)
13289 if (victim->HasAura(55095))
13290 AddPct(DoneTotalMod, (*i)->GetAmount());
13291 }
13292 break;
13293 }
13294 // Rage of Rivendare
13295 case 7293:
13296 {
13297 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0x02000000, 0))
13298 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
13299 break;
13300 }
13301 // Marked for Death
13302 case 7598:
13303 case 7599:
13304 case 7600:
13305 case 7601:
13306 case 7602:
13307 {
13308 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
13309 AddPct(DoneTotalMod, (*i)->GetAmount());
13310 break;
13311 }
13312 // Dirty Deeds
13313 case 6427:
13314 case 6428:
13315 {
13316 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
13317 {
13318 // effect 0 has expected value but in negative state
13319 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
13320 AddPct(DoneTotalMod, bonus);
13321 }
13322 break;
13323 }
13324 }
13325 }
13326
13327 // Custom scripted damage
13328 if (spellProto)
13329 switch (spellProto->SpellFamilyName)
13330 {
13332 // Glacier Rot
13333 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
13335 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
13336 AddPct(DoneTotalMod, aurEff->GetAmount());
13337 break;
13338 }
13339
13340 // Some spells don't benefit from done mods
13341 if (spellProto)
13342 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
13343 {
13344 DoneFlatBenefit = 0;
13345 DoneTotalMod = 1.0f;
13346 }
13347
13348 float tmpDamage = float(int32(pdamage) + DoneFlatBenefit) * DoneTotalMod;
13349
13350 // apply spellmod to Done damage
13351 if (spellProto)
13352 if (Player* modOwner = GetSpellModOwner())
13353 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_DAMAGE, tmpDamage);
13354
13355 // bonus result can be negative
13356 return uint32(std::max(tmpDamage, 0.0f));
13357}
@ SPELL_EFFECT_NORMALIZED_WEAPON_DMG
Definition SharedDefines.h:899
@ SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM
Definition SharedDefines.h:583
@ SPELL_ATTR3_IGNORE_CASTER_MODIFIERS
Definition SharedDefines.h:522
@ SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:165
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS
Definition SpellAuraDefines.h:231
@ SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS
Definition SpellAuraDefines.h:194
@ SPELL_AURA_MOD_DAMAGE_PERCENT_DONE
Definition SpellAuraDefines.h:142
@ SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE
Definition SpellAuraDefines.h:366
@ SPELL_AURA_MOD_DAMAGE_DONE_CREATURE
Definition SpellAuraDefines.h:122
@ SPELLMOD_DAMAGE
Definition SpellDefines.h:76
float GetAPMultiplier(WeaponAttackType attType, bool normalized)
Definition Unit.cpp:17290
AuraEffect * GetDummyAuraEffect(SpellFamilyNames name, uint32 iconId, uint8 effIndex) const
Definition Unit.h:1360

References AddPct(), AURA_STATE_HEALTHLESS_35_PERCENT, SpellInfo::Effects, GetAPMultiplier(), GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), GetSpellModOwner(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HealthAbovePct(), SpellInfo::Id, Object::IsCreature(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_DAMAGE_DONE_CREATURE, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_MELEE_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_RANGED_ATTACK_POWER_VERSUS, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_EFFECT_NORMALIZED_WEAPON_DMG, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_DAMAGE, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeDamageBonusTaken()

uint32 Unit::MeleeDamageBonusTaken ( Unit attacker,
uint32  pdamage,
WeaponAttackType  attType,
SpellInfo const *  spellProto = nullptr,
SpellSchoolMask  damageSchoolMask = SPELL_SCHOOL_MASK_NORMAL 
)
13360{
13361 if (pdamage == 0)
13362 return 0;
13363
13364 int32 TakenFlatBenefit = 0;
13365
13366 // ..taken
13368 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
13369 if ((*i)->GetMiscValue() & damageSchoolMask)
13370 TakenFlatBenefit += (*i)->GetAmount();
13371
13372 if (attType != RANGED_ATTACK)
13374 else
13376
13377 // Taken total percent damage auras
13378 float TakenTotalMod = 1.0f;
13379
13381
13382 // .. taken pct (special attacks)
13383 if (spellProto)
13384 {
13385 // From caster spells
13387 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
13388 if ((*i)->GetCasterGUID() == attacker->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
13389 AddPct(TakenTotalMod, (*i)->GetAmount());
13390
13391 // Mod damage from spell mechanic
13392 uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask();
13393
13394 // Shred, Maul - "Effects which increase Bleed damage also increase Shred damage"
13395 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[0] & 0x00008800)
13396 mechanicMask |= (1 << MECHANIC_BLEED);
13397
13398 if (mechanicMask)
13399 {
13401 for (AuraEffectList::const_iterator i = mDamageDoneMechanic.begin(); i != mDamageDoneMechanic.end(); ++i)
13402 if (mechanicMask & uint32(1 << ((*i)->GetMiscValue())))
13403 AddPct(TakenTotalMod, (*i)->GetAmount());
13404 }
13405 }
13406
13407 TakenTotalMod = processDummyAuras(TakenTotalMod);
13408
13409 // .. taken pct: class scripts
13410 /*AuraEffectList const& mclassScritAuras = GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
13411 for (AuraEffectList::const_iterator i = mclassScritAuras.begin(); i != mclassScritAuras.end(); ++i)
13412 {
13413 switch ((*i)->GetMiscValue())
13414 {
13415 }
13416 }*/
13417
13418 if (attType != RANGED_ATTACK)
13419 {
13421 for (AuraEffectList::const_iterator i = mModMeleeDamageTakenPercent.begin(); i != mModMeleeDamageTakenPercent.end(); ++i)
13422 AddPct(TakenTotalMod, (*i)->GetAmount());
13423 }
13424 else
13425 {
13426 AuraEffectList const& mModRangedDamageTakenPercent = GetAuraEffectsByType(SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT);
13427 for (AuraEffectList::const_iterator i = mModRangedDamageTakenPercent.begin(); i != mModRangedDamageTakenPercent.end(); ++i)
13428 AddPct(TakenTotalMod, (*i)->GetAmount());
13429 }
13430
13431 // No positive taken bonus, custom attr
13432 if (spellProto)
13433 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
13434 {
13435 TakenFlatBenefit = 0;
13436 TakenTotalMod = 1.0f;
13437 }
13438
13439 // xinef: sanctified wrath talent
13440 if (TakenTotalMod < 1.0f && attacker->HasIgnoreTargetResistAura())
13441 {
13442 float ignoreModifier = 1.0f - TakenTotalMod;
13443 bool addModifier = false;
13445 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
13446 if ((*j)->GetMiscValue() & damageSchoolMask)
13447 {
13448 ApplyPct(ignoreModifier, (*j)->GetAmount());
13449 addModifier = true;
13450 }
13451
13452 if (addModifier)
13453 TakenTotalMod += ignoreModifier;
13454 }
13455
13456 float tmpDamage = (float(pdamage) + TakenFlatBenefit) * TakenTotalMod;
13457
13458 // bonus result can be negative
13459 return uint32(std::max(tmpDamage, 0.0f));
13460}
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN
Definition SpellAuraDefines.h:176
@ SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
Definition SpellAuraDefines.h:150
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN
Definition SpellAuraDefines.h:188
@ SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:189
@ SPELL_AURA_MOD_DAMAGE_TAKEN
Definition SpellAuraDefines.h:77
@ SPELL_AURA_MOD_DAMAGE_FROM_CASTER
Definition SpellAuraDefines.h:334
@ SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT
Definition SpellAuraDefines.h:318
@ SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT
Definition SpellAuraDefines.h:177
@ SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS
Definition SpellInfo.h:197
float processDummyAuras(float TakenTotalMod) const
Definition Unit.cpp:11985
bool HasIgnoreTargetResistAura() const
Definition Unit.h:1742

References AddPct(), ApplyPct(), SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), GetTotalAuraModifier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), MECHANIC_BLEED, processDummyAuras(), RANGED_ATTACK, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_DAMAGE_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN, SPELL_AURA_MOD_MELEE_DAMAGE_TAKEN_PCT, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN, SPELL_AURA_MOD_RANGED_DAMAGE_TAKEN_PCT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by CalculateMeleeDamage(), and Spell::EffectWeaponDmg().

◆ MeleeSpellHitResult()

SpellMissInfo Unit::MeleeSpellHitResult ( Unit victim,
SpellInfo const *  spell 
)
3183{
3184 // Spells with SPELL_ATTR3_ALWAYS_HIT will additionally fully ignore
3185 // resist and deflect chances
3186 if (spellInfo->HasAttribute(SPELL_ATTR3_ALWAYS_HIT))
3187 return SPELL_MISS_NONE;
3188
3189 WeaponAttackType attType = BASE_ATTACK;
3190
3191 // Check damage class instead of attack type to correctly handle judgements
3192 // - they are meele, but can't be dodged/parried/deflected because of ranged dmg class
3193 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED)
3194 attType = RANGED_ATTACK;
3195
3196 int32 attackerWeaponSkill;
3197 // skill value for these spells (for example judgements) is 5* level
3198 if (spellInfo->DmgClass == SPELL_DAMAGE_CLASS_RANGED && !spellInfo->IsRangedWeaponSpell())
3199 attackerWeaponSkill = GetLevel() * 5;
3200 // bonus from skills is 0.04% per skill Diff
3201 else
3202 attackerWeaponSkill = int32(GetWeaponSkillValue(attType, victim));
3203
3204 int32 skillDiff = attackerWeaponSkill - int32(victim->GetMaxSkillValueForLevel(this));
3205
3206 uint32 roll = urand (0, 10000);
3207
3208 uint32 missChance = uint32(MeleeSpellMissChance(victim, attType, skillDiff, spellInfo->Id) * 100.0f);
3209 // Roll miss
3210 uint32 tmp = missChance;
3211 if (roll < tmp)
3212 return SPELL_MISS_MISS;
3213
3214 bool canDodge = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_DODGE);
3215 bool canParry = !spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_PARRY);
3216 bool canBlock = spellInfo->HasAttribute(SPELL_ATTR3_COMPLETELY_BLOCKED) && !spellInfo->HasAttribute(SPELL_ATTR0_CU_DIRECT_DAMAGE);
3217
3218 // Same spells cannot be parry/dodge
3219 if (spellInfo->HasAttribute(SPELL_ATTR0_NO_ACTIVE_DEFENSE))
3220 return SPELL_MISS_NONE;
3221
3222 // Chance resist mechanic
3223 int32 resist_chance = victim->GetMechanicResistChance(spellInfo) * 100;
3224 tmp += resist_chance;
3225 if (roll < tmp)
3226 return SPELL_MISS_RESIST;
3227
3228 // Ranged attacks can only miss, resist and deflect
3229 if (attType == RANGED_ATTACK)
3230 {
3231 // only if in front
3232 if (!victim->HasUnitState(UNIT_STATE_STUNNED) && (victim->HasInArc(M_PI, this) || victim->HasIgnoreHitDirectionAura()))
3233 {
3234 int32 deflect_chance = victim->GetTotalAuraModifier(SPELL_AURA_DEFLECT_SPELLS) * 100;
3235 tmp += deflect_chance;
3236 if (roll < tmp)
3237 return SPELL_MISS_DEFLECT;
3238 }
3239
3240 canDodge = false;
3241 canParry = false;
3242 }
3243
3244 // Check for attack from behind
3245 // xinef: if from behind or spell requires cast from behind
3246 if (!victim->HasInArc(M_PI, this))
3247 {
3248 if (!victim->HasIgnoreHitDirectionAura() || spellInfo->HasAttribute(SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET))
3249 {
3250 // Can`t dodge from behind in PvP (but its possible in PvE)
3251 if (victim->IsPlayer())
3252 {
3253 canDodge = false;
3254 }
3255
3256 // Can`t parry or block
3257 canParry = false;
3258 canBlock = false;
3259 }
3260 }
3261
3262 // Check creatures flags_extra for disable parry
3263 if (victim->IsCreature())
3264 {
3265 uint32 flagEx = victim->ToCreature()->GetCreatureTemplate()->flags_extra;
3266 // Xinef: no dodge flag
3267 if (flagEx & CREATURE_FLAG_EXTRA_NO_DODGE)
3268 canDodge = false;
3269 if (flagEx & CREATURE_FLAG_EXTRA_NO_PARRY)
3270 canParry = false;
3271 // Check creatures flags_extra for disable block
3272 if (flagEx & CREATURE_FLAG_EXTRA_NO_BLOCK)
3273 canBlock = false;
3274 }
3275 // Ignore combat result aura
3277 for (AuraEffectList::const_iterator i = ignore.begin(); i != ignore.end(); ++i)
3278 {
3279 if (!(*i)->IsAffectedOnSpell(spellInfo))
3280 continue;
3281 switch ((*i)->GetMiscValue())
3282 {
3283 case MELEE_HIT_DODGE:
3284 canDodge = false;
3285 break;
3286 case MELEE_HIT_BLOCK:
3287 canBlock = false;
3288 break;
3289 case MELEE_HIT_PARRY:
3290 canParry = false;
3291 break;
3292 default:
3293 LOG_DEBUG("entities.unit", "Spell {} SPELL_AURA_IGNORE_COMBAT_RESULT has unhandled state {}", (*i)->GetId(), (*i)->GetMiscValue());
3294 break;
3295 }
3296 }
3297
3298 if (canDodge)
3299 {
3300 // Roll dodge
3301 int32 dodgeChance = int32(victim->GetUnitDodgeChance() * 100.0f) - skillDiff * 4;
3302 // Reduce enemy dodge chance by SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
3304 dodgeChance = int32(float(dodgeChance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
3305 // Reduce dodge chance by attacker expertise rating
3306 if (IsPlayer())
3307 dodgeChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3308 else
3310
3311 // xinef: cant dodge while casting or while stunned
3312 if (dodgeChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3313 dodgeChance = 0;
3314
3315 tmp += dodgeChance;
3316 if (roll < tmp)
3317 return SPELL_MISS_DODGE;
3318 }
3319
3320 if (canParry)
3321 {
3322 // Roll parry
3323 int32 parryChance = int32(victim->GetUnitParryChance() * 100.0f) - skillDiff * 4;
3324 // Reduce parry chance by attacker expertise rating
3325 if (IsPlayer())
3326 parryChance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100.0f);
3327 else
3329
3330 // xinef: cant parry while casting or while stunned
3331 if (parryChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3332 parryChance = 0;
3333
3334 tmp += parryChance;
3335 if (roll < tmp)
3336 return SPELL_MISS_PARRY;
3337 }
3338
3339 if (canBlock)
3340 {
3341 int32 blockChance = int32(victim->GetUnitBlockChance() * 100.0f) - skillDiff * 4;
3342
3343 // xinef: cant block while casting or while stunned
3344 if (blockChance < 0 || victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
3345 blockChance = 0;
3346
3347 tmp += blockChance;
3348 if (roll < tmp)
3349 return SPELL_MISS_BLOCK;
3350 }
3351
3352 return SPELL_MISS_NONE;
3353}
@ CREATURE_FLAG_EXTRA_NO_PARRY
Definition CreatureData.h:47
@ CREATURE_FLAG_EXTRA_NO_DODGE
Definition CreatureData.h:68
@ SPELL_ATTR7_NO_ATTACK_PARRY
Definition SharedDefines.h:665
@ SPELL_ATTR7_NO_ATTACK_DODGE
Definition SharedDefines.h:664
@ SPELL_ATTR3_COMPLETELY_BLOCKED
Definition SharedDefines.h:496
@ SPELL_MISS_PARRY
Definition SharedDefines.h:1523
@ SPELL_MISS_DODGE
Definition SharedDefines.h:1522
@ SPELL_MISS_BLOCK
Definition SharedDefines.h:1524
@ SPELL_AURA_MOD_EXPERTISE
Definition SpellAuraDefines.h:303
@ SPELL_AURA_IGNORE_COMBAT_RESULT
Definition SpellAuraDefines.h:265
@ SPELL_AURA_MOD_ENEMY_DODGE
Definition SpellAuraDefines.h:314
@ SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
Definition SpellAuraDefines.h:311
@ SPELL_ATTR0_CU_DIRECT_DAMAGE
Definition SpellInfo.h:184
@ SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET
Definition SpellInfo.h:193
float GetUnitDodgeChance() const
Definition Unit.cpp:3668
float GetTotalAuraMultiplier(AuraType auratype) const
Definition Unit.cpp:6011
float GetUnitParryChance() const
Definition Unit.cpp:3685
float MeleeSpellMissChance(Unit const *victim, WeaponAttackType attType, int32 skillDiff, uint32 spellId) const
Definition Unit.cpp:19074
uint32 flags_extra
Definition CreatureData.h:246

References BASE_ATTACK, CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, SpellInfo::DmgClass, CreatureTemplate::flags_extra, GetAuraEffectsByType(), Creature::GetCreatureTemplate(), GetLevel(), GetMaxSkillValueForLevel(), GetMechanicResistChance(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetUnitBlockChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), SpellInfo::HasAttribute(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), SpellInfo::Id, Object::IsCreature(), IsNonMeleeSpellCast(), Object::IsPlayer(), SpellInfo::IsRangedWeaponSpell(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_DODGE, MELEE_HIT_PARRY, MeleeSpellMissChance(), RANGED_ATTACK, SPELL_ATTR0_CU_DIRECT_DAMAGE, SPELL_ATTR0_CU_REQ_CASTER_BEHIND_TARGET, SPELL_ATTR0_NO_ACTIVE_DEFENSE, SPELL_ATTR3_ALWAYS_HIT, SPELL_ATTR3_COMPLETELY_BLOCKED, SPELL_ATTR7_NO_ATTACK_DODGE, SPELL_ATTR7_NO_ATTACK_PARRY, SPELL_AURA_DEFLECT_SPELLS, SPELL_AURA_IGNORE_COMBAT_RESULT, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, SPELL_DAMAGE_CLASS_RANGED, SPELL_MISS_BLOCK, SPELL_MISS_DEFLECT, SPELL_MISS_DODGE, SPELL_MISS_MISS, SPELL_MISS_NONE, SPELL_MISS_PARRY, SPELL_MISS_RESIST, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, UNIT_STATE_STUNNED, urand(), and VICTIMSTATE_DODGE.

Referenced by SpellHitResult(), and SpellHitResult().

◆ MeleeSpellMissChance()

float Unit::MeleeSpellMissChance ( Unit const *  victim,
WeaponAttackType  attType,
int32  skillDiff,
uint32  spellId 
) const
19075{
19076 SpellInfo const* spellInfo = spellId ? sSpellMgr->GetSpellInfo(spellId) : nullptr;
19077 if (spellInfo && spellInfo->HasAttribute(SPELL_ATTR7_NO_ATTACK_MISS))
19078 {
19079 return 0.0f;
19080 }
19081
19082 //calculate miss chance
19083 float missChance = victim->GetUnitMissChance(attType);
19084
19085 // Check if dual wielding, add additional miss penalty - when mainhand has on next swing spell, offhand doesnt suffer penalty
19086 if (!spellId && (attType != RANGED_ATTACK) && HasOffhandWeaponForAttack() && (!m_currentSpells[CURRENT_MELEE_SPELL] || !m_currentSpells[CURRENT_MELEE_SPELL]->IsNextMeleeSwingSpell()))
19087 {
19088 missChance += 19;
19089 }
19090
19091 // bonus from skills is 0.04%
19092 //miss_chance -= skillDiff * 0.04f;
19093 int32 diff = -skillDiff;
19094 if (victim->IsPlayer())
19095 missChance += diff > 0 ? diff * 0.04f : diff * 0.02f;
19096 else
19097 missChance += diff > 10 ? 1 + (diff - 10) * 0.4f : diff * 0.1f;
19098
19099 // Calculate hit chance
19100 float hitChance = 100.0f;
19101
19102 // Spellmod from SPELLMOD_RESIST_MISS_CHANCE
19103 if (spellId)
19104 {
19105 if (Player* modOwner = GetSpellModOwner())
19106 modOwner->ApplySpellMod(spellId, SPELLMOD_RESIST_MISS_CHANCE, hitChance);
19107 }
19108
19109 missChance -= hitChance - 100.0f;
19110
19111 if (attType == RANGED_ATTACK)
19112 missChance -= m_modRangedHitChance;
19113 else
19114 missChance -= m_modMeleeHitChance;
19115
19116 // Limit miss chance from 0 to 60%
19117 if (missChance < 0.0f)
19118 return 0.0f;
19119 if (missChance > 60.0f)
19120 return 60.0f;
19121 return missChance;
19122}

References CURRENT_MELEE_SPELL, GetSpellModOwner(), GetUnitMissChance(), SpellInfo::HasAttribute(), HasOffhandWeaponForAttack(), Object::IsPlayer(), m_currentSpells, m_modMeleeHitChance, m_modRangedHitChance, RANGED_ATTACK, SPELL_ATTR7_NO_ATTACK_MISS, SPELLMOD_RESIST_MISS_CHANCE, and sSpellMgr.

Referenced by MeleeSpellHitResult(), and RollMeleeOutcomeAgainst().

◆ ModifyAuraState()

void Unit::ModifyAuraState ( AuraStateType  flag,
bool  apply 
)
10584{
10585 if (apply)
10586 {
10587 if (!HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10588 {
10589 SetFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10590 Unit::AuraMap& tAuras = GetOwnedAuras();
10591 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10592 {
10593 if ((*itr).second->IsRemoved())
10594 continue;
10595
10596 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10597 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10598 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, true);
10599 }
10600 }
10601 }
10602 else
10603 {
10604 if (HasFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1)))
10605 {
10606 RemoveFlag(UNIT_FIELD_AURASTATE, 1 << (flag - 1));
10607
10608 if (flag != AURA_STATE_ENRAGE) // enrage aura state triggering continues auras
10609 {
10610 Unit::AuraMap& tAuras = GetOwnedAuras();
10611 for (Unit::AuraMap::iterator itr = tAuras.begin(); itr != tAuras.end(); ++itr)
10612 {
10613 if ((*itr).second->GetSpellInfo()->CasterAuraState == flag )
10614 if (AuraApplication* aurApp = (*itr).second->GetApplicationOfTarget(GetGUID()))
10615 (*itr).second->HandleAllEffects(aurApp, AURA_EFFECT_HANDLE_REAL, false);
10616 }
10617 }
10618 }
10619 }
10620}
@ AURA_STATE_ENRAGE
Definition SharedDefines.h:1309
@ AURA_EFFECT_HANDLE_REAL
Definition SpellAuraDefines.h:42
void SetFlag(uint16 index, uint32 newFlag)
Definition Object.cpp:845
void RemoveFlag(uint16 index, uint32 oldFlag)
Definition Object.cpp:860
std::multimap< uint32, Aura * > AuraMap
Definition Unit.h:625
AuraMap & GetOwnedAuras()
Definition Unit.h:1296

References AURA_EFFECT_HANDLE_REAL, AURA_STATE_ENRAGE, Object::GetGUID(), GetOwnedAuras(), Object::HasFlag(), Object::RemoveFlag(), Object::SetFlag(), and UNIT_FIELD_AURASTATE.

Referenced by _ApplyAura(), _UnapplyAura(), ClearAllReactives(), Spell::finish(), debug_commandscript::HandleDebugSetAuraStateCommand(), boss_professor_putricide::boss_professor_putricideAI::JustSummoned(), ProcDamageAndSpellFor(), Update(), and UpdateReactives().

◆ ModifyHealth()

int32 Unit::ModifyHealth ( int32  val)
14182{
14183 int32 gain = 0;
14184
14185 if (dVal == 0)
14186 return 0;
14187
14188 int32 curHealth = (int32)GetHealth();
14189
14190 int32 val = dVal + curHealth;
14191 if (val <= 0)
14192 {
14193 SetHealth(0);
14194 return -curHealth;
14195 }
14196
14197 int32 maxHealth = (int32)GetMaxHealth();
14198
14199 if (val < maxHealth)
14200 {
14201 SetHealth(val);
14202 gain = val - curHealth;
14203 }
14204 else if (curHealth != maxHealth)
14205 {
14206 SetHealth(maxHealth);
14207 gain = maxHealth - curHealth;
14208 }
14209
14210 return gain;
14211}

References GetHealth(), GetMaxHealth(), and SetHealth().

Referenced by DealDamage(), DealHeal(), boss_xt002::boss_xt002AI::DoAction(), boss_ichoron::boss_ichoronAI::DoAction(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandlePeriodicHealthFunnelAuraTick(), boss_hadronox::boss_hadronoxAI::KilledUnit(), boss_gluth::boss_gluthAI::KilledUnit(), Creature::RegenerateHealth(), Player::RegenerateHealth(), npc_injured_patient::npc_injured_patientAI::Reset(), Spell::TakePower(), Aura::Update(), and npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI().

◆ ModifyPower()

int32 Unit::ModifyPower ( Powers  power,
int32  val,
bool  withPowerUpdate = true 
)
14240{
14241 if (dVal == 0)
14242 return 0;
14243
14244 int32 gain = 0;
14245
14246 int32 curPower = (int32)GetPower(power);
14247
14248 int32 val = dVal + curPower;
14249 if (val <= 0)
14250 {
14251 SetPower(power, 0, withPowerUpdate);
14252 return -curPower;
14253 }
14254
14255 int32 maxPower = (int32)GetMaxPower(power);
14256
14257 if (val < maxPower)
14258 {
14259 SetPower(power, val, withPowerUpdate);
14260 gain = val - curPower;
14261 }
14262 else if (curPower != maxPower)
14263 {
14264 SetPower(power, maxPower, withPowerUpdate);
14265 gain = maxPower - curPower;
14266 }
14267
14268 if (GetAI())
14269 {
14270 GetAI()->OnPowerUpdate(power, gain, dVal, curPower);
14271 }
14272
14273 return gain;
14274}
virtual void OnPowerUpdate(Powers, int32, int32, uint32)
Called when the creature power updates.
Definition UnitAI.h:374
void SetPower(Powers power, uint32 val, bool withPowerUpdate=true, bool fromRegenerate=false)
Definition Unit.cpp:15656

References GetAI(), GetMaxPower(), GetPower(), UnitAI::OnPowerUpdate(), and SetPower().

Referenced by CalcAbsorbResist(), spell_igb_cannon_blast::CalculatePower(), Spell::EffectPowerBurn(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), EnergizeBySpell(), AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), spell_kelthuzad_detonate_mana_aura::HandleScript(), boss_pathaleon_the_calculator::JustEngagedWith(), boss_curator::JustEngagedWith(), Pet::LoseHappiness(), ModifyPowerPct(), Creature::Regenerate(), RewardRage(), Pet::setDeathState(), Spell::TakePower(), Spell::TakeRunePower(), Aura::Update(), and boss_faction_championsAI::UpdateAI().

◆ ModifyPowerPct()

int32 Unit::ModifyPowerPct ( Powers  power,
float  pct,
bool  apply = true 
)
14278{
14279 float amount = (float)GetMaxPower(power);
14280 ApplyPercentModFloatVar(amount, pct, apply);
14281
14282 return ModifyPower(power, (int32)amount - (int32)GetMaxPower(power));
14283}

References ApplyPercentModFloatVar(), GetMaxPower(), and ModifyPower().

Referenced by AuraEffect::HandleAuraModIncreaseEnergyPercent().

◆ ModifyRedirectThreat()

void Unit::ModifyRedirectThreat ( int32  amount)
inline
void ModifyThreatPct(int32 amount)
Definition ThreatMgr.h:307

References _redirectThreatInfo, and RedirectThreatInfo::ModifyThreatPct().

Referenced by spell_warr_vigilance::HandleAfterApply().

◆ ModSpellCastTime()

void Unit::ModSpellCastTime ( SpellInfo const *  spellProto,
int32 castTime,
Spell spell = nullptr 
)
Todo:
:(MadAgos) Eventually check and delete the bool argument
15064{
15065 if (!spellInfo || castTime < 0)
15066 return;
15067
15068 if (spellInfo->IsChanneled() && spellInfo->HasAura(SPELL_AURA_MOUNTED))
15069 return;
15070
15071 // called from caster
15072 if (Player* modOwner = GetSpellModOwner())
15074 modOwner->ApplySpellMod(spellInfo->Id, SPELLMOD_CASTING_TIME, castTime, spell, bool(modOwner != this && !IsPet()));
15075
15076 switch (spellInfo->DmgClass)
15077 {
15079 if (spellInfo->AttributesEx5 & SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC) // required double check
15080 castTime = int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15081 else if (spellInfo->SpellVisual[0] == 3881 && HasAura(67556)) // cooking with Chef Hat.
15082 castTime = 500;
15083 break;
15085 break; // no known cases
15087 castTime = CanInstantCast() ? 0 : int32(float(castTime) * GetFloatValue(UNIT_MOD_CAST_SPEED));
15088 break;
15090 castTime = int32(float(castTime) * m_modAttackSpeedPct[RANGED_ATTACK]);
15091 break;
15092 default:
15093 break;
15094 }
15095}
@ SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC
Definition SharedDefines.h:580
@ SPELLMOD_CASTING_TIME
Definition SpellDefines.h:86
bool CanInstantCast() const
Definition Unit.h:1506

References SpellInfo::AttributesEx5, CanInstantCast(), SpellInfo::DmgClass, Object::GetFloatValue(), GetSpellModOwner(), SpellInfo::HasAura(), HasAura(), SpellInfo::Id, SpellInfo::IsChanneled(), IsPet(), m_modAttackSpeedPct, RANGED_ATTACK, SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC, SPELL_AURA_MOUNTED, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLMOD_CASTING_TIME, SpellInfo::SpellVisual, and UNIT_MOD_CAST_SPEED.

Referenced by SpellInfo::CalcCastTime().

◆ ModSpellDuration()

int32 Unit::ModSpellDuration ( SpellInfo const *  spellProto,
Unit const *  target,
int32  duration,
bool  positive,
uint32  effectMask 
)
14964{
14965 // don't mod permanent auras duration
14966 if (duration < 0)
14967 return duration;
14968
14969 // some auras are not affected by duration modifiers
14970 if (spellProto->HasAttribute(SPELL_ATTR7_NO_TARGET_DURATION_MOD))
14971 return duration;
14972
14973 // cut duration only of negative effects
14974 // xinef: also calculate self casts, spell can be reflected for example
14975 if (!positive)
14976 {
14977 int32 mechanic = spellProto->GetSpellMechanicMaskByEffectMask(effectMask);
14978
14979 int32 durationMod;
14980 int32 durationMod_always = 0;
14981 int32 durationMod_not_stack = 0;
14982
14983 for (uint8 i = 1; i <= MECHANIC_ENRAGED; ++i)
14984 {
14985 if (!(mechanic & 1 << i))
14986 continue;
14987
14988 // Xinef: spells affecting movement imparing effects should not reduce duration if disoriented mechanic is present
14989 if (i == MECHANIC_SNARE && (mechanic & (1 << MECHANIC_DISORIENTED)))
14990 continue;
14991
14992 // Find total mod value (negative bonus)
14993 int32 new_durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD, i);
14994 // Find max mod (negative bonus)
14995 int32 new_durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, i);
14996 // Check if mods applied before were weaker
14997 if (new_durationMod_always < durationMod_always)
14998 durationMod_always = new_durationMod_always;
14999 if (new_durationMod_not_stack < durationMod_not_stack)
15000 durationMod_not_stack = new_durationMod_not_stack;
15001 }
15002
15003 // Select strongest negative mod
15004 if (durationMod_always > durationMod_not_stack)
15005 durationMod = durationMod_not_stack;
15006 else
15007 durationMod = durationMod_always;
15008
15009 if (durationMod != 0)
15010 AddPct(duration, durationMod);
15011
15012 // there are only negative mods currently
15013 durationMod_always = target->GetTotalAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, spellProto->Dispel);
15014 durationMod_not_stack = target->GetMaxNegativeAuraModifierByMiscValue(SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, spellProto->Dispel);
15015
15016 durationMod = 0;
15017 if (durationMod_always > durationMod_not_stack)
15018 durationMod += durationMod_not_stack;
15019 else
15020 durationMod += durationMod_always;
15021
15022 if (durationMod != 0)
15023 AddPct(duration, durationMod);
15024 }
15025 else
15026 {
15027 // else positive mods here, there are no currently
15028 // when there will be, change GetTotalAuraModifierByMiscValue to GetTotalPositiveAuraModifierByMiscValue
15029 }
15030
15031 // Glyphs which increase duration of selfcasted buffs
15032 if (target == this)
15033 {
15034 switch (spellProto->SpellFamilyName)
15035 {
15036 case SPELLFAMILY_DRUID:
15037 if (spellProto->SpellFamilyFlags[0] & 0x100)
15038 {
15039 // Glyph of Thorns
15040 if (AuraEffect* aurEff = GetAuraEffect(57862, 0))
15041 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15042 }
15043 break;
15045 if ((spellProto->SpellFamilyFlags[0] & 0x00000002) && spellProto->SpellIconID == 298)
15046 {
15047 // Glyph of Blessing of Might
15048 if (AuraEffect* aurEff = GetAuraEffect(57958, 0))
15049 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15050 }
15051 else if ((spellProto->SpellFamilyFlags[0] & 0x00010000) && spellProto->SpellIconID == 306)
15052 {
15053 // Glyph of Blessing of Wisdom
15054 if (AuraEffect* aurEff = GetAuraEffect(57979, 0))
15055 duration += aurEff->GetAmount() * MINUTE * IN_MILLISECONDS;
15056 }
15057 break;
15058 }
15059 }
15060 return std::max(duration, 0);
15061}
constexpr auto MINUTE
Definition Common.h:47
@ SPELL_ATTR7_NO_TARGET_DURATION_MOD
Definition SharedDefines.h:642
@ MECHANIC_ENRAGED
Definition SharedDefines.h:1356
@ MECHANIC_DISORIENTED
Definition SharedDefines.h:1327
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK
Definition SpellAuraDefines.h:309
@ SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK
Definition SpellAuraDefines.h:297
@ SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL
Definition SpellAuraDefines.h:308
@ SPELL_AURA_MECHANIC_DURATION_MOD
Definition SpellAuraDefines.h:295

References AddPct(), SpellInfo::Dispel, GetAuraEffect(), GetMaxNegativeAuraModifierByMiscValue(), SpellInfo::GetSpellMechanicMaskByEffectMask(), GetTotalAuraModifierByMiscValue(), SpellInfo::HasAttribute(), IN_MILLISECONDS, MECHANIC_DISORIENTED, MECHANIC_ENRAGED, MECHANIC_SNARE, MINUTE, SPELL_ATTR7_NO_TARGET_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD, SPELL_AURA_MECHANIC_DURATION_MOD_NOT_STACK, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL, SPELL_AURA_MOD_AURA_DURATION_BY_DISPEL_NOT_STACK, SPELLFAMILY_DRUID, SPELLFAMILY_PALADIN, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, and SpellInfo::SpellIconID.

Referenced by Spell::DoSpellHitOnUnit(), and Spell::EffectInterruptCast().

◆ MonsterMoveWithSpeed()

◆ Mount()

void Unit::Mount ( uint32  mount,
uint32  vehicleId = 0,
uint32  creatureEntry = 0 
)
13549{
13550 if (mount)
13552
13554
13555 if (Player* player = ToPlayer())
13556 {
13557 sScriptMgr->AnticheatSetUnderACKmount(player);
13558
13559 // mount as a vehicle
13560 if (VehicleId)
13561 {
13562 if (CreateVehicleKit(VehicleId, creatureEntry))
13563 {
13564 GetVehicleKit()->Reset();
13565
13566 // Send others that we now have a vehicle
13568 data << GetPackGUID();
13569 data << uint32(VehicleId);
13570 SendMessageToSet(&data, true);
13571
13573 player->GetSession()->SendPacket(&data);
13574
13575 // mounts can also have accessories
13577 }
13578 }
13579
13580 // unsummon pet
13581 Pet* pet = player->GetPet();
13582 if (pet)
13583 {
13585 // don't unsummon pet in arena but SetFlag UNIT_FLAG_STUNNED to disable pet's interface
13586 if (bg && bg->isArena())
13588 else
13589 player->UnsummonPetTemporaryIfAny();
13590 }
13591
13592 // xinef: if we have charmed npc, stun him also
13593 if (Unit* charm = player->GetCharm())
13594 if (charm->IsCreature())
13595 charm->SetUnitFlag(UNIT_FLAG_STUNNED);
13596
13597 WorldPacket data(SMSG_MOVE_SET_COLLISION_HGT, GetPackGUID().size() + 4 + 4);
13598 data << GetPackGUID();
13599 data << uint32(GameTime::GetGameTime().count()); // Packet counter
13600 data << player->GetCollisionHeight();
13601 player->GetSession()->SendPacket(&data);
13602 }
13603
13605}
@ AURA_INTERRUPT_FLAG_MOUNT
Definition SpellDefines.h:60
bool isArena() const
Definition Battleground.h:404
bool CreateVehicleKit(uint32 id, uint32 creatureEntry)
Returns the transport this unit is on directly (if on vehicle and transport, return vehicle)
Definition Unit.cpp:18801
void Reset(bool evading=false)
Definition Vehicle.cpp:120
void InstallAllAccessories(bool evading)
Definition Vehicle.cpp:87

References AURA_INTERRUPT_FLAG_MOUNT, CreateVehicleKit(), Player::GetBattleground(), GetCharm(), GameTime::GetGameTime(), Object::GetPackGUID(), GetVehicleKit(), WorldPacket::Initialize(), Vehicle::InstallAllAccessories(), Battleground::isArena(), RemoveAurasWithInterruptFlags(), Vehicle::Reset(), WorldObject::SendMessageToSet(), SetUInt32Value(), SetUnitFlag(), SMSG_MOVE_SET_COLLISION_HGT, SMSG_ON_CANCEL_EXPECTED_RIDE_VEHICLE_AURA, SMSG_PLAYER_VEHICLE_DATA, sScriptMgr, Object::ToPlayer(), UNIT_FIELD_MOUNTDISPLAYID, UNIT_FLAG_MOUNT, and UNIT_FLAG_STUNNED.

Referenced by AuraEffect::HandleAuraMounted(), spell_mount_check_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyMountCommand(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), npc_lady_sylvanas_windrunner_bfu::npc_lady_sylvanas_windrunner_bfuAI::JustRespawned(), Creature::LoadCreaturesAddon(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_scarlet_courier::npc_scarlet_courierAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), and WorldSession::SendDoFlight().

◆ NearTeleportTo() [1/2]

void Unit::NearTeleportTo ( float  x,
float  y,
float  z,
float  orientation,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19804{
19805 DisableSpline();
19806 if (IsPlayer())
19807 ToPlayer()->TeleportTo(GetMapId(), x, y, z, orientation, TELE_TO_NOT_LEAVE_COMBAT | (removeTransport ? 0 : TELE_TO_NOT_LEAVE_TRANSPORT) | TELE_TO_NOT_UNSUMMON_PET | (casting ? TELE_TO_SPELL : 0) | (vehicleTeleport ? TELE_TO_NOT_LEAVE_VEHICLE : 0) | (withPet ? TELE_TO_WITH_PET : 0));
19808 else
19809 {
19810 Position pos = {x, y, z, orientation};
19811 SendTeleportPacket(pos);
19812 UpdatePosition(x, y, z, orientation, true);
19815 }
19816}
@ TELE_TO_WITH_PET
Definition Player.h:834
@ TELE_TO_NOT_LEAVE_VEHICLE
Definition Player.h:833
@ TELE_TO_SPELL
Definition Player.h:832
@ TELE_TO_NOT_LEAVE_COMBAT
Definition Player.h:830
@ TELE_TO_NOT_UNSUMMON_PET
Definition Player.h:831
@ TELE_TO_NOT_LEAVE_TRANSPORT
Definition Player.h:829
void ReinitializeMovement()
Definition MotionMaster.cpp:904
bool TeleportTo(uint32 mapid, float x, float y, float z, float orientation, uint32 options=0, Unit *target=nullptr, bool newInstance=false)
Definition Player.cpp:1340
void SendTeleportPacket(Position &pos)
Definition Unit.cpp:19825
void UpdateObjectVisibility(bool forced=true, bool fromUpdate=false) override
Definition Unit.cpp:19216
virtual bool UpdatePosition(float x, float y, float z, float ang, bool teleport=false)
Definition Unit.cpp:19844

References DisableSpline(), WorldLocation::GetMapId(), GetMotionMaster(), Object::IsPlayer(), MotionMaster::ReinitializeMovement(), SendTeleportPacket(), TELE_TO_NOT_LEAVE_COMBAT, TELE_TO_NOT_LEAVE_TRANSPORT, TELE_TO_NOT_LEAVE_VEHICLE, TELE_TO_NOT_UNSUMMON_PET, TELE_TO_SPELL, TELE_TO_WITH_PET, Player::TeleportTo(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdatePosition().

◆ NearTeleportTo() [2/2]

void Unit::NearTeleportTo ( Position pos,
bool  casting = false,
bool  vehicleTeleport = false,
bool  withPet = false,
bool  removeTransport = false 
)
19799{
19800 NearTeleportTo(pos.GetPositionX(), pos.GetPositionY(), pos.GetPositionZ(), pos.GetOrientation(), casting, vehicleTeleport, withPet, removeTransport);
19801}
void NearTeleportTo(Position &pos, bool casting=false, bool vehicleTeleport=false, bool withPet=false, bool removeTransport=false)
Definition Unit.cpp:19798

References Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), and NearTeleportTo().

Referenced by boss_viscidus::DamageTaken(), npc_madrigosa::DoAction(), npc_akama_illidan::DoAction(), Spell::EffectLeap(), Spell::EffectResurrectPet(), Spell::EffectStuck(), Spell::EffectSummonPet(), Spell::EffectTeleportUnits(), Spell::EffectTeleUnitsFaceCaster(), npc_giant_claw_tentacle::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), BattlegroundBE::HandleAreaTrigger(), BattlegroundDS::HandleAreaTrigger(), BattlegroundNA::HandleAreaTrigger(), BattlegroundRL::HandleAreaTrigger(), BattlegroundRV::HandleAreaTrigger(), spell_moroes_vanish::HandleDummy(), spell_class_call_handler::HandleOnHitRogue(), npc_echo_of_medivh::HandlePieceJustDied(), BattlegroundBE::HandlePlayerUnderMap(), BattlegroundDS::HandlePlayerUnderMap(), BattlegroundNA::HandlePlayerUnderMap(), BattlegroundRL::HandlePlayerUnderMap(), BattlegroundRV::HandlePlayerUnderMap(), npc_pet_mage_mirror_image::InitializeAI(), boss_urom::boss_uromAI::JustDied(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_grandmaster_vorpil::JustEngagedWith(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), NearTeleportTo(), npc_ball_of_flame::npc_ball_of_flameAI::npc_ball_of_flameAI(), npc_chesspiece::OnCharmed(), npc_vh_sinclari::OnGossipSelect(), npc_cos_chromie_start::OnGossipSelect(), npc_chesspiece::Reset(), boss_gothik::boss_gothikAI::Reset(), Map::ScriptsProcess(), npc_simon_bunny::npc_simon_bunnyAI::SetUpPreGame(), boss_urom::boss_uromAI::SpellHit(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_frostwing_vrykul::npc_frostwing_vrykulAI::SpellHitTarget(), npc_nerubian_burrower::npc_nerubian_burrowerAI::SpellHitTarget(), npc_pos_leader_second::npc_pos_leader_secondAI::SpellHitTarget(), boss_cyanigosa::boss_cyanigosaAI::SpellHitTarget(), BattlegroundRV::TeleportUnitToNewZ(), Vehicle::TeleportVehicle(), npc_doomfire_spirit::TryTeleportInDirection(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_coldflame::npc_coldflameAI::UpdateAI(), boss_magus_telestra::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), and npc_minigob_manabonk::UpdateAI().

◆ OutDebugInfo()

void Unit::OutDebugInfo ( ) const
20054{
20055 LOG_ERROR("entities.unit", "Unit::OutDebugInfo");
20056 LOG_INFO("entities.unit", "GUID {}, name {}", GetGUID().ToString(), GetName());
20057 LOG_INFO("entities.unit", "OwnerGUID {}, MinionGUID {}, CharmerGUID {}, CharmedGUID {}",
20059 LOG_INFO("entities.unit", "In world {}, unit type mask {}", (uint32)(IsInWorld() ? 1 : 0), m_unitTypeMask);
20060 if (IsInWorld())
20061 LOG_INFO("entities.unit", "Mapid {}", GetMapId());
20062
20063 LOG_INFO("entities.unit", "Summon Slot: ");
20064 for (uint32 i = 0; i < MAX_SUMMON_SLOT; ++i)
20065 LOG_INFO("entities.unit", "{}, ", m_SummonSlot[i].ToString());
20066 LOG_INFO("server.loading", " ");
20067
20068 LOG_INFO("entities.unit", "Controlled List: ");
20069 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20070 LOG_INFO("entities.unit", "{}, ", (*itr)->GetGUID().ToString());
20071 LOG_INFO("server.loading", " ");
20072
20073 LOG_INFO("entities.unit", "Aura List: ");
20074 for (AuraApplicationMap::const_iterator itr = m_appliedAuras.begin(); itr != m_appliedAuras.end(); ++itr)
20075 LOG_INFO("entities.unit", "{}, ", itr->first);
20076 LOG_INFO("server.loading", " ");
20077
20078 if (IsVehicle())
20079 {
20080 LOG_INFO("entities.unit", "Passenger List: ");
20081 for (SeatMap::iterator itr = GetVehicleKit()->Seats.begin(); itr != GetVehicleKit()->Seats.end(); ++itr)
20082 if (Unit* passenger = ObjectAccessor::GetUnit(*GetVehicleBase(), itr->second.Passenger.Guid))
20083 LOG_INFO("entities.unit", "{}, ", passenger->GetGUID().ToString());
20084 LOG_INFO("server.loading", " ");
20085 }
20086
20087 if (GetVehicle())
20088 LOG_INFO("entities.unit", "On vehicle {}.", GetVehicleBase()->GetEntry());
20089}
Seats
Definition boss_flame_leviathan.cpp:168
SeatMap Seats
Definition Vehicle.h:56

References GetCharmerGUID(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), WorldLocation::GetMapId(), GetMinionGUID(), WorldObject::GetName(), GetOwnerGUID(), ObjectAccessor::GetUnit(), GetVehicle(), GetVehicleBase(), GetVehicleKit(), Object::IsInWorld(), IsVehicle(), LOG_ERROR, LOG_INFO, m_appliedAuras, m_Controlled, m_SummonSlot, m_unitTypeMask, MAX_SUMMON_SLOT, Vehicle::Seats, and Position::ToString().

Referenced by SetMinion().

◆ PatchValuesUpdate()

void Unit::PatchValuesUpdate ( ByteBuffer valuesUpdateBuf,
BuildValuesCachePosPointers posPointers,
Player target 
)
private
20704{
20705 Creature const* creature = ToCreature();
20706
20707 // UNIT_NPC_FLAGS
20708 if (creature && posPointers.UnitNPCFlagsPos >= 0)
20709 {
20710 uint32 appendValue = m_uint32Values[UNIT_NPC_FLAGS];
20711
20712 if (sWorld->getIntConfig(CONFIG_INSTANT_TAXI) == 2 && appendValue & UNIT_NPC_FLAG_FLIGHTMASTER)
20713 appendValue |= UNIT_NPC_FLAG_GOSSIP; // flight masters need NPC gossip flag to show instant flight toggle option
20714
20715 if (!target->CanSeeSpellClickOn(creature))
20716 appendValue &= ~UNIT_NPC_FLAG_SPELLCLICK;
20717
20718 if (!target->CanSeeVendor(creature))
20719 appendValue &= ~UNIT_NPC_FLAG_VENDOR_MASK;
20720
20721 if (!creature->IsValidTrainerForPlayer(target, &appendValue))
20722 appendValue &= ~UNIT_NPC_FLAG_TRAINER;
20723
20724 valuesUpdateBuf.put(posPointers.UnitNPCFlagsPos, appendValue);
20725 }
20726
20727 // UNIT_FIELD_AURASTATE
20728 if (posPointers.UnitFieldAuraStatePos >= 0)
20729 valuesUpdateBuf.put(posPointers.UnitFieldAuraStatePos, uint32(BuildAuraStateUpdateForTarget(target)));
20730
20731 // UNIT_FIELD_FLAGS
20732 if (posPointers.UnitFieldFlagsPos >= 0)
20733 {
20734 uint32 appendValue = m_uint32Values[UNIT_FIELD_FLAGS];
20735 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20736 appendValue &= ~UNIT_FLAG_NOT_SELECTABLE;
20737
20738 valuesUpdateBuf.put(posPointers.UnitFieldFlagsPos, appendValue);
20739 }
20740
20741 // UNIT_FIELD_DISPLAYID
20742 // Use modelid_a if not gm, _h if gm for CREATURE_FLAG_EXTRA_TRIGGER creatures.
20743 if (posPointers.UnitFieldDisplayPos >= 0)
20744 {
20746 if (creature)
20747 {
20748 CreatureTemplate const* cinfo = creature->GetCreatureTemplate();
20749
20750 // this also applies for transform auras
20751 if (SpellInfo const* transform = sSpellMgr->GetSpellInfo(getTransForm()))
20752 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
20753 if (transform->Effects[i].IsAura(SPELL_AURA_TRANSFORM))
20754 if (CreatureTemplate const* transformInfo = sObjectMgr->GetCreatureTemplate(transform->Effects[i].MiscValue))
20755 {
20756 cinfo = transformInfo;
20757 break;
20758 }
20759
20761 {
20762 if (target->IsGameMaster() && target->GetSession()->IsGMAccount())
20763 displayId = cinfo->GetFirstVisibleModel()->CreatureDisplayID;
20764 else
20765 displayId = cinfo->GetFirstInvisibleModel()->CreatureDisplayID;
20766 }
20767 }
20768
20769 valuesUpdateBuf.put(posPointers.UnitFieldDisplayPos, uint32(displayId));
20770 }
20771
20772 // UNIT_DYNAMIC_FLAGS
20773 // Hide lootable animation for unallowed players.
20774 if (posPointers.UnitDynamicFlagsPos >= 0)
20775 {
20777
20778 if (creature)
20779 {
20780 if (creature->hasLootRecipient())
20781 {
20782 dynamicFlags |= UNIT_DYNFLAG_TAPPED;
20783 if (creature->isTappedBy(target))
20784 dynamicFlags |= UNIT_DYNFLAG_TAPPED_BY_PLAYER;
20785 }
20786
20787 if (!target->isAllowedToLoot(creature))
20788 dynamicFlags &= ~UNIT_DYNFLAG_LOOTABLE;
20789 }
20790
20791 // unit UNIT_DYNFLAG_TRACK_UNIT should only be sent to caster of SPELL_AURA_MOD_STALKED auras
20792 if (dynamicFlags & UNIT_DYNFLAG_TRACK_UNIT)
20794 dynamicFlags &= ~UNIT_DYNFLAG_TRACK_UNIT;
20795
20796 valuesUpdateBuf.put(posPointers.UnitDynamicFlagsPos, dynamicFlags);
20797 }
20798
20799 // UNIT_FIELD_BYTES_2
20800 if (posPointers.UnitFieldBytes2Pos >= 0)
20801 {
20802 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20803 {
20805 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20806 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20807 // Allow targetting opposite faction in party when enabled in config
20808 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & ((UNIT_BYTE2_FLAG_SANCTUARY /*| UNIT_BYTE2_FLAG_AURAS | UNIT_BYTE2_FLAG_UNK5*/) << 8))); // this flag is at uint8 offset 1 !!
20809 }// pussywizard / Callmephil
20810 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20811 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20812 {
20813 valuesUpdateBuf.put(posPointers.UnitFieldBytes2Pos, (m_uint32Values[UNIT_FIELD_BYTES_2] & 0xFFFFF2FF)); // clear UNIT_BYTE2_FLAG_PVP, UNIT_BYTE2_FLAG_FFA_PVP, UNIT_BYTE2_FLAG_SANCTUARY
20814 }
20815 }
20816
20817 // UNIT_FIELD_FACTIONTEMPLATE
20818 if (posPointers.UnitFieldFactionTemplatePos >= 0)
20819 {
20820 if (IsControlledByPlayer() && target != this && sWorld->getBoolConfig(CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP) && IsInRaidWith(target))
20821 {
20823 FactionTemplateEntry const* ft2 = target->GetFactionTemplateEntry();
20824 if (ft1 && ft2 && !ft1->IsFriendlyTo(*ft2))
20825 // pretend that all other HOSTILE players have own faction, to allow follow, heal, rezz (trade wont work)
20826 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20827 }// pussywizard / Callmephil
20828 else if (target->IsSpectator() && target->FindMap() && target->FindMap()->IsBattleArena() &&
20829 (this->IsPlayer() || this->IsCreature() || this->IsDynamicObject()))
20830 {
20831 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20832 }
20833 else if (target->IsGMSpectator() && IsControlledByPlayer())
20834 {
20835 valuesUpdateBuf.put(posPointers.UnitFieldFactionTemplatePos, uint32(target->GetFaction()));
20836 }
20837 }
20838
20839 sScriptMgr->OnPatchValuesUpdate(this, valuesUpdateBuf, posPointers, target);
20840}
@ CREATURE_FLAG_EXTRA_TRIGGER
Definition CreatureData.h:52
@ UNIT_DYNFLAG_TRACK_UNIT
Definition SharedDefines.h:3361
@ CONFIG_INSTANT_TAXI
Definition WorldConfig.h:337
@ CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP
Definition WorldConfig.h:34
void put(std::size_t pos, T value)
Definition ByteBuffer.h:137
bool IsValidTrainerForPlayer(Player *player, uint32 *npcFlags=nullptr) const
Definition Creature.cpp:1276
bool isTappedBy(Player const *player) const
Definition Creature.cpp:1392
bool isAllowedToLoot(Creature const *creature)
Definition PlayerStorage.cpp:5620
bool CanSeeVendor(Creature const *creature) const
Definition Player.cpp:14278
bool IsGMSpectator() const
Definition Player.h:1181
bool IsSpectator() const
Definition Player.h:2590
bool CanSeeSpellClickOn(Creature const *creature) const
Definition Player.cpp:14255
uint32 BuildAuraStateUpdateForTarget(Unit *target) const
Definition Unit.cpp:10622
bool IsGMAccount() const
Definition WorldSession.cpp:205
int32 UnitFieldFlagsPos
Definition UnitUtils.h:99
int32 UnitFieldDisplayPos
Definition UnitUtils.h:100
int32 UnitDynamicFlagsPos
Definition UnitUtils.h:101
int32 UnitFieldAuraStatePos
Definition UnitUtils.h:98
int32 UnitFieldFactionTemplatePos
Definition UnitUtils.h:103
int32 UnitFieldBytes2Pos
Definition UnitUtils.h:102
int32 UnitNPCFlagsPos
Definition UnitUtils.h:97
uint32 CreatureDisplayID
Definition CreatureData.h:179
CreatureModel const * GetFirstInvisibleModel() const
Definition Creature.cpp:162
CreatureModel const * GetFirstVisibleModel() const
Definition Creature.cpp:172

References BuildAuraStateUpdateForTarget(), Player::CanSeeSpellClickOn(), Player::CanSeeVendor(), CONFIG_ALLOW_TWO_SIDE_INTERACTION_GROUP, CONFIG_INSTANT_TAXI, CREATURE_FLAG_EXTRA_TRIGGER, CreatureModel::CreatureDisplayID, WorldObject::FindMap(), Creature::GetCreatureTemplate(), GetFaction(), GetFactionTemplateEntry(), CreatureTemplate::GetFirstInvisibleModel(), CreatureTemplate::GetFirstVisibleModel(), Object::GetGUID(), Player::GetSession(), getTransForm(), HasAuraTypeWithCaster(), CreatureTemplate::HasFlagsExtra(), Creature::hasLootRecipient(), Player::isAllowedToLoot(), Map::IsBattleArena(), IsControlledByPlayer(), FactionTemplateEntry::IsFriendlyTo(), Player::IsGameMaster(), WorldSession::IsGMAccount(), Player::IsGMSpectator(), IsInRaidWith(), Player::IsSpectator(), Creature::isTappedBy(), Creature::IsValidTrainerForPlayer(), Object::m_uint32Values, MAX_SPELL_EFFECTS, ByteBuffer::put(), sObjectMgr, SPELL_AURA_MOD_STALKED, SPELL_AURA_TRANSFORM, sScriptMgr, sSpellMgr, sWorld, Object::ToCreature(), UNIT_BYTE2_FLAG_SANCTUARY, UNIT_DYNAMIC_FLAGS, UNIT_DYNFLAG_LOOTABLE, UNIT_DYNFLAG_TAPPED, UNIT_DYNFLAG_TAPPED_BY_PLAYER, UNIT_DYNFLAG_TRACK_UNIT, UNIT_FIELD_BYTES_2, UNIT_FIELD_DISPLAYID, UNIT_FIELD_FLAGS, UNIT_NPC_FLAG_FLIGHTMASTER, UNIT_NPC_FLAG_GOSSIP, UNIT_NPC_FLAGS, BuildValuesCachePosPointers::UnitDynamicFlagsPos, BuildValuesCachePosPointers::UnitFieldAuraStatePos, BuildValuesCachePosPointers::UnitFieldBytes2Pos, BuildValuesCachePosPointers::UnitFieldDisplayPos, BuildValuesCachePosPointers::UnitFieldFactionTemplatePos, BuildValuesCachePosPointers::UnitFieldFlagsPos, and BuildValuesCachePosPointers::UnitNPCFlagsPos.

Referenced by BuildValuesUpdate().

◆ PauseMovement()

void Unit::PauseMovement ( uint32  timer = 0,
uint8  slot = 0 
)
virtual

Disable the unit movement by clearing UNIT_STATE_MOVING and stopping the spline.

16742{
16743 if (slot >= MAX_MOTION_SLOT)
16744 return;
16745
16746 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16747 movementGenerator->Pause(timer);
16748
16749 StopMoving();
16750}
@ MAX_MOTION_SLOT
Definition MotionMaster.h:66
Definition MovementGenerator.h:28
void StopMoving()
Definition Unit.cpp:16722

References GetMotionMaster(), MAX_MOTION_SLOT, and StopMoving().

Referenced by WorldSession::HandleBattlemasterHelloOpcode(), WorldSession::HandleGossipHelloOpcode(), spell_chapter5_return_to_capital::HandleHit(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::SendListInventory(), boss_shade_of_aran::SetGUID(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ PetSpellFail()

void Unit::PetSpellFail ( SpellInfo const *  spellInfo,
Unit target,
uint32  result 
)
20182{
20183 CharmInfo* charmInfo = GetCharmInfo();
20184 if (!charmInfo || !IsCreature())
20185 return;
20186
20187 if ((sDisableMgr->IsPathfindingEnabled(GetMap()) || result != SPELL_FAILED_LINE_OF_SIGHT) && target)
20188 {
20189 if ((result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE) || !ToCreature()->HasReactState(REACT_PASSIVE))
20190 if (Unit* owner = GetOwner())
20191 {
20192 if (spellInfo->IsPositive() && IsFriendlyTo(target))
20193 {
20194 AttackStop();
20195 charmInfo->SetIsAtStay(false);
20196 charmInfo->SetIsCommandAttack(true);
20197 charmInfo->SetIsReturning(false);
20198 charmInfo->SetIsFollowing(false);
20199
20200 GetMotionMaster()->MoveFollow(target, PET_FOLLOW_DIST, rand_norm() * 2 * M_PI);
20201 }
20202 else if (owner->IsValidAttackTarget(target))
20203 {
20204 AttackStop();
20205 charmInfo->SetIsAtStay(false);
20206 charmInfo->SetIsCommandAttack(true);
20207 charmInfo->SetIsReturning(false);
20208 charmInfo->SetIsFollowing(false);
20209
20210 if (!ToCreature()->HasReactState(REACT_PASSIVE))
20211 ToCreature()->AI()->AttackStart(target);
20212 else
20213 GetMotionMaster()->MoveChase(target);
20214 }
20215 }
20216
20217 // can be extended in future
20218 if (result == SPELL_FAILED_LINE_OF_SIGHT || result == SPELL_FAILED_OUT_OF_RANGE)
20219 {
20220 charmInfo->SetForcedSpell(spellInfo->IsPositive() ? -int32(spellInfo->Id) : spellInfo->Id);
20221 charmInfo->SetForcedTargetGUID(target->GetGUID());
20222 }
20223 else
20224 {
20225 charmInfo->SetForcedSpell(0);
20227 }
20228 }
20229}
#define sDisableMgr
Definition DisableMgr.h:88
#define PET_FOLLOW_DIST
Definition PetDefines.h:205
@ SPELL_FAILED_OUT_OF_RANGE
Definition SharedDefines.h:1046
@ SPELL_FAILED_LINE_OF_SIGHT
Definition SharedDefines.h:996
void MoveChase(Unit *target, std::optional< ChaseRange > dist={}, std::optional< ChaseAngle > angle={})
Force the unit to chase this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:313
void MoveFollow(Unit *target, float dist, float angle, MovementSlot slot=MOTION_SLOT_ACTIVE, bool inheritWalkState=true, bool inheritSpeed=true)
The unit will follow this target. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:409
virtual void AttackStart(Unit *)
Definition UnitAI.cpp:27
void SetIsAtStay(bool val)
Definition CharmInfo.cpp:365
void SetIsFollowing(bool val)
Definition CharmInfo.cpp:375
void SetIsReturning(bool val)
Definition CharmInfo.cpp:385
void SetForcedSpell(uint32 id)
Definition CharmInfo.h:177
void SetForcedTargetGUID(ObjectGuid guid=ObjectGuid::Empty)
Definition CharmInfo.h:179
void SetIsCommandAttack(bool val)
Definition CharmInfo.cpp:303

References Creature::AI(), UnitAI::AttackStart(), AttackStop(), ObjectGuid::Empty, GetCharmInfo(), Object::GetGUID(), WorldObject::GetMap(), GetMotionMaster(), GetOwner(), SpellInfo::Id, Object::IsCreature(), IsFriendlyTo(), SpellInfo::IsPositive(), MotionMaster::MoveChase(), MotionMaster::MoveFollow(), PET_FOLLOW_DIST, rand_norm(), REACT_PASSIVE, sDisableMgr, CharmInfo::SetForcedSpell(), CharmInfo::SetForcedTargetGUID(), CharmInfo::SetIsAtStay(), CharmInfo::SetIsCommandAttack(), CharmInfo::SetIsFollowing(), CharmInfo::SetIsReturning(), SPELL_FAILED_LINE_OF_SIGHT, SPELL_FAILED_OUT_OF_RANGE, and Object::ToCreature().

Referenced by WorldSession::HandlePetActionHelper(), and WorldSession::HandlePetCastSpellOpcode().

◆ ProcDamageAndSpell()

void Unit::ProcDamageAndSpell ( Unit actor,
Unit victim,
uint32  procAttacker,
uint32  procVictim,
uint32  procEx,
uint32  amount,
WeaponAttackType  attType = BASE_ATTACK,
SpellInfo const *  procSpellInfo = nullptr,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
static
6466{
6467 // Not much to do if no flags are set.
6468 if (procAttacker && actor)
6469 actor->ProcDamageAndSpellFor(false, victim, procAttacker, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6470 // Now go on with a victim's events'n'auras
6471 // Not much to do if no flags are set or there is no victim
6472 if (victim && victim->IsAlive() && procVictim)
6473 victim->ProcDamageAndSpellFor(true, actor, procVictim, procExtra, attType, procSpellInfo, amount, procAura, procAuraEffectIndex, procSpell, damageInfo, healInfo, procPhase);
6474}

References IsAlive(), and ProcDamageAndSpellFor().

Referenced by Spell::_cast(), Spell::_handle_finish_phase(), AttackerStateUpdate(), Spell::DoAllEffectOnTarget(), ReflectEvent::Execute(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), and Kill().

◆ ProcDamageAndSpellFor()

void Unit::ProcDamageAndSpellFor ( bool  isVictim,
Unit target,
uint32  procFlag,
uint32  procExtra,
WeaponAttackType  attType,
SpellInfo const *  procSpellInfo,
uint32  damage,
SpellInfo const *  procAura = nullptr,
int8  procAuraEffectIndex = -1,
Spell const *  procSpell = nullptr,
DamageInfo damageInfo = nullptr,
HealInfo healInfo = nullptr,
uint32  procPhase = 2 
)
16131{
16132 // Player is loaded now - do not allow passive spell casts to proc
16133 if (IsPlayer() && ToPlayer()->GetSession()->PlayerLoading())
16134 return;
16135 // For melee/ranged based attack need update skills and set some Aura states if victim present
16136 if (procFlag & MELEE_BASED_TRIGGER_MASK && target && procPhase == PROC_SPELL_PHASE_HIT)
16137 {
16138 // Xinef: Shaman in ghost wolf form cant proc anything melee based
16139 if (!isVictim && GetShapeshiftForm() == FORM_GHOSTWOLF)
16140 return;
16141
16142 // Update skills here for players
16143 // only when you are not fighting other players or their pets/totems (pvp)
16144 if (IsPlayer() && !target->IsCharmedOwnedByPlayerOrPlayer())
16145 {
16146 // On melee based hit/miss/resist/parry/dodge need to update skill (for victim and attacker)
16148 {
16149 ToPlayer()->UpdateCombatSkills(target, attType, isVictim, procSpell ? procSpell->m_weaponItem : nullptr);
16150 }
16151 // Update defence if player is victim and we block - TODO: confirm that blocked attacks only have a chance to increase defence skill
16152 else if (isVictim && procExtra & (PROC_EX_BLOCK))
16153 {
16154 ToPlayer()->UpdateCombatSkills(target, attType, true);
16155 }
16156 }
16157 // If exist crit/parry/dodge/block need update aura state (for victim and attacker)
16159 {
16160 // for victim
16161 if (isVictim)
16162 {
16163 // if victim and dodge attack
16164 if (procExtra & PROC_EX_DODGE)
16165 {
16166 // Update AURA_STATE on dodge
16167 if (!IsClass(CLASS_ROGUE, CLASS_CONTEXT_ABILITY_REACTIVE)) // skip Rogue Riposte
16168 {
16171 }
16172 }
16173 // if victim and parry attack
16174 if (procExtra & PROC_EX_PARRY)
16175 {
16176 // For Hunters only Counterattack (skip Mongoose bite)
16178 {
16181 }
16182 else
16183 {
16186 }
16187 }
16188 // if and victim block attack
16189 if (procExtra & PROC_EX_BLOCK)
16190 {
16193 }
16194 }
16195 else // For attacker
16196 {
16197 // Overpower on victim dodge
16198 if (procExtra & PROC_EX_DODGE)
16199 {
16201 {
16202 AddComboPoints(target, 1);
16204 }
16205 }
16206
16207 // Wolverine Bite
16208 if ((procExtra & PROC_HIT_CRITICAL) && IsHunterPet())
16209 {
16210 AddComboPoints(target, 1);
16212 }
16213 }
16214 }
16215 }
16216
16217 Unit* actor = isVictim ? target : this;
16218 Unit* actionTarget = !isVictim ? target : this;
16219
16220 ProcEventInfo eventInfo = ProcEventInfo(actor, actionTarget, target, procFlag, 0, procPhase, procExtra, procSpell, damageInfo, healInfo, procAura, procAuraEffectIndex);
16221
16222 ProcTriggeredList procTriggered;
16223 // Fill procTriggered list
16224 for (AuraApplicationMap::const_iterator itr = GetAppliedAuras().begin(); itr != GetAppliedAuras().end(); ++itr)
16225 {
16226 // Do not allow auras to proc from effect triggered by itself
16227 if (procAura && procAura->Id == itr->first)
16228 continue;
16229
16230 // Xinef: Generic Item Equipment cooldown, -1 is a special marker
16231 if (itr->second->GetBase()->GetCastItemGUID() && HasSpellItemCooldown(itr->first, uint32(-1)))
16232 continue;
16233
16234 ProcTriggeredData triggerData(itr->second->GetBase());
16235 // Defensive procs are active on absorbs (so absorption effects are not a hindrance)
16236 bool active = damage || (procExtra & PROC_EX_BLOCK && isVictim);
16237 if (isVictim)
16238 procExtra &= ~PROC_EX_INTERNAL_REQ_FAMILY;
16239
16240 SpellInfo const* spellProto = itr->second->GetBase()->GetSpellInfo();
16241
16242 // only auras that have trigger spell should proc from fully absorbed damage
16243 if (procExtra & PROC_EX_ABSORB && isVictim)
16244 if (damage || spellProto->Effects[EFFECT_0].TriggerSpell || spellProto->Effects[EFFECT_1].TriggerSpell || spellProto->Effects[EFFECT_2].TriggerSpell)
16245 active = true;
16246
16247 // xinef: fix spell procing from damaging / healing casts if spell has DoT / HoT effect only
16248 // only player spells are taken into account
16249 if (!active && !isVictim && !(procFlag & PROC_FLAG_DONE_PERIODIC) && procSpellInfo && procSpellInfo->SpellFamilyName && (procSpellInfo->HasAura(SPELL_AURA_PERIODIC_DAMAGE) || procSpellInfo->HasAura(SPELL_AURA_PERIODIC_HEAL)))
16250 active = true;
16251
16252 // AuraScript Hook
16253 if (!triggerData.aura->CallScriptCheckProcHandlers(itr->second, eventInfo))
16254 {
16255 continue;
16256 }
16257
16258 bool isTriggeredAtSpellProcEvent = IsTriggeredAtSpellProcEvent(target, triggerData.aura, attType, isVictim, active, triggerData.spellProcEvent, eventInfo);
16259
16260 // AuraScript Hook
16261 if (!triggerData.aura->CallScriptAfterCheckProcHandlers(itr->second, eventInfo, isTriggeredAtSpellProcEvent))
16262 {
16263 continue;
16264 }
16265
16266 // do checks using conditions table
16267 ConditionList conditions = sConditionMgr->GetConditionsForNotGroupedEntry(CONDITION_SOURCE_TYPE_SPELL_PROC, spellProto->Id);
16268 ConditionSourceInfo condInfo = ConditionSourceInfo(eventInfo.GetActor(), eventInfo.GetActionTarget());
16269 if (!sConditionMgr->IsObjectMeetToConditions(condInfo, conditions))
16270 {
16271 continue;
16272 }
16273
16274 bool hasTriggeredProc = false;
16275 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
16276 {
16277 if (itr->second->HasEffect(i))
16278 {
16279 AuraEffect* aurEff = itr->second->GetBase()->GetEffect(i);
16280
16281 // Skip this auras
16282 if (isNonTriggerAura[aurEff->GetAuraType()])
16283 continue;
16284
16285 // If not trigger by default and spellProcEvent == nullptr - skip
16286 if (!isTriggerAura[aurEff->GetAuraType()] && !triggerData.spellProcEvent)
16287 continue;
16288
16289 switch (aurEff->GetAuraType())
16290 {
16293 case SPELL_AURA_DUMMY:
16295 if (uint32 triggerSpellId = aurEff->GetSpellInfo()->Effects[i].TriggerSpell)
16296 {
16297 triggerData.triggerSpelId[i] = triggerSpellId;
16298 hasTriggeredProc = true;
16299 }
16300 break;
16301 default:
16302 break;
16303 }
16304
16305 // Some spells must always trigger
16306 //if (isAlwaysTriggeredAura[aurEff->GetAuraType()])
16307 triggerData.effMask |= 1 << i;
16308 }
16309 }
16310
16311 if (triggerData.effMask)
16312 {
16313 // If there is aura that triggers another proc aura, make sure that the triggered one is going to be proccessed on top of it
16314 if (hasTriggeredProc)
16315 {
16316 bool proccessed = false;
16317 for (uint8 i = 0; i < EFFECT_ALL; ++i)
16318 {
16319 if (uint32 triggeredSpellId = triggerData.triggerSpelId[i])
16320 {
16321 auto iter = std::find(procTriggered.begin(), procTriggered.end(), triggeredSpellId);
16322 if (iter != procTriggered.end())
16323 {
16324 std::advance(iter, 1);
16325 procTriggered.insert(iter, triggerData);
16326 proccessed = true;
16327 break;
16328 }
16329 }
16330 }
16331
16332 if (!proccessed)
16333 {
16334 procTriggered.push_front(triggerData);
16335 }
16336 }
16337 else
16338 {
16339 procTriggered.push_front(triggerData);
16340 }
16341 }
16342 }
16343
16344 // Nothing found
16345 if (procTriggered.empty())
16346 return;
16347
16348 // Note: must SetCantProc(false) before return
16350 SetCantProc(true);
16351
16352 // Handle effects proceed this time
16353 for (ProcTriggeredList::const_iterator i = procTriggered.begin(); i != procTriggered.end(); ++i)
16354 {
16355 // look for aura in auras list, it may be removed while proc event processing
16356 if (i->aura->IsRemoved())
16357 continue;
16358
16359 bool useCharges = i->aura->IsUsingCharges();
16360 // no more charges to use, prevent proc
16361 if (useCharges && !i->aura->GetCharges())
16362 continue;
16363
16364 bool takeCharges = false;
16365 SpellInfo const* spellInfo = i->aura->GetSpellInfo();
16366
16367 AuraApplication* aurApp = i->aura->GetApplicationOfTarget(GetGUID());
16368
16369 bool prepare = i->aura->CallScriptPrepareProcHandlers(aurApp, eventInfo);
16370
16371 // For players set spell cooldown if need
16372 uint32 cooldown = 0;
16373 if (prepare && i->spellProcEvent && i->spellProcEvent->cooldown)
16374 cooldown = i->spellProcEvent->cooldown;
16375
16376 // Xinef: set cooldown for actual proc
16377 eventInfo.SetProcCooldown(cooldown);
16378
16379 // Note: must SetCantProc(false) before return
16381 SetCantProc(true);
16382
16383 bool handled = i->aura->CallScriptProcHandlers(aurApp, eventInfo);
16384
16385 // "handled" is needed as long as proc can be handled in multiple places
16386 if (!handled && HandleAuraProc(target, damage, i->aura, procSpellInfo, procFlag, procExtra, cooldown, &handled))
16387 {
16388 uint32 Id = i->aura->GetId();
16389 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), Id);
16390 takeCharges = true;
16391 }
16392
16393 if (!handled)
16394 for (uint8 effIndex = 0; effIndex < MAX_SPELL_EFFECTS; ++effIndex)
16395 {
16396 if (!(i->effMask & (1 << effIndex)))
16397 continue;
16398
16399 AuraEffect* triggeredByAura = i->aura->GetEffect(effIndex);
16400 ASSERT(triggeredByAura);
16401
16402 bool prevented = i->aura->CallScriptEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16403 if (prevented)
16404 {
16405 takeCharges = true;
16406 continue;
16407 }
16408
16409 switch (triggeredByAura->GetAuraType())
16410 {
16412 {
16413 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16414 // Don`t drop charge or add cooldown for not started trigger
16415 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16416 takeCharges = true;
16417 break;
16418 }
16420 {
16421 // target has to be valid
16422 if (!eventInfo.GetProcTarget())
16423 break;
16424
16425 triggeredByAura->HandleProcTriggerDamageAuraProc(aurApp, eventInfo); // this function is part of the new proc system
16426 takeCharges = true;
16427 break;
16428 }
16430 case SPELL_AURA_DUMMY:
16431 {
16432 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} dummy aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16433 if (HandleDummyAuraProc(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, eventInfo))
16434 takeCharges = true;
16435 break;
16436 }
16441 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, isVictim ? "a victim's" : "an attacker's", triggeredByAura->GetId());
16442 takeCharges = true;
16443 break;
16445 {
16446 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell id {} (triggered by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16447 if (HandleOverrideClassScriptAuraProc(target, damage, triggeredByAura, procSpellInfo, cooldown))
16448 takeCharges = true;
16449 break;
16450 }
16452 {
16453 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16454 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16455 if (damage > 0)
16456 {
16458 takeCharges = true;
16459 }
16460 break;
16461 }
16463 {
16464 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting mending (triggered by {} dummy aura of spell {})",
16465 (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16466 HandleAuraRaidProcFromCharge(triggeredByAura);
16467 takeCharges = true;
16468 break;
16469 }
16471 {
16472 LOG_DEBUG("spells.aura", "ProcDamageAndSpell: casting spell {} (triggered with value by {} aura of spell {})", spellInfo->Id, (isVictim ? "a victim's" : "an attacker's"), triggeredByAura->GetId());
16473
16474 if (HandleProcTriggerSpell(target, damage, triggeredByAura, procSpellInfo, procFlag, procExtra, cooldown, procPhase, eventInfo))
16475 takeCharges = true;
16476 break;
16477 }
16479 // Skip melee hits or instant cast spells
16480 // xinef: check channeled spells which are affected by haste also
16481 if (procSpellInfo && (procSpellInfo->SpellFamilyName || !IsPlayer()) &&
16482 (procSpellInfo->CalcCastTime() > 0 /*||
16483 (procSpell->IsChanneled() && procSpell->GetDuration() > 0 && (HasAuraTypeWithAffectMask(SPELL_AURA_PERIODIC_HASTE, procSpell) || procSpell->HasAttribute(SPELL_ATTR5_SPELL_HASTE_AFFECTS_PERIODIC)))*/))
16484 takeCharges = true;
16485 break;
16487 // Skip Melee hits and spells ws wrong school
16488 if (procSpellInfo && (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16489 takeCharges = true;
16490 break;
16492 // Skip Melee hits and targets with magnet aura
16493 if (procSpellInfo && (triggeredByAura->GetBase()->GetUnitOwner()->ToUnit() == ToUnit())) // Magnet
16494 takeCharges = true;
16495 break;
16498 // Skip melee hits and spells ws wrong school or zero cost
16499 if (procSpellInfo &&
16500 (procSpellInfo->ManaCost != 0 || procSpellInfo->ManaCostPercentage != 0 || (procSpellInfo->SpellFamilyFlags[1] & 0x2)) && // Cost check, mutilate include
16501 (triggeredByAura->GetMiscValue() & procSpellInfo->SchoolMask)) // School check
16502 takeCharges = true;
16503 break;
16506 // Compare mechanic
16507 if (procSpellInfo && procSpellInfo->Mechanic == uint32(triggeredByAura->GetMiscValue()))
16508 takeCharges = true;
16509 break;
16511 // Compare casters
16512 if (target && triggeredByAura->GetCasterGUID() == target->GetGUID())
16513 takeCharges = true;
16514 break;
16515 // CC Auras which use their amount amount to drop
16516 // Are there any more auras which need this?
16522 {
16523 // Spell own direct damage at apply wont break the CC
16524 // Xinef: Or when the aura is at full duration (assume that such auras should be added at the end, skipping all damage procs etc.)
16525 if (procSpellInfo)
16526 if ((!i->aura->IsPermanent() && i->aura->GetDuration() == i->aura->GetMaxDuration()) || procSpellInfo->Id == triggeredByAura->GetId() ||
16527 procSpellInfo->HasAttribute(SPELL_ATTR4_REACTIVE_DAMAGE_PROC))
16528 break;
16529
16530 // chargeable mods are breaking on hit
16531 if (useCharges)
16532 takeCharges = true;
16533 else if (triggeredByAura->GetAmount()) // aura must have amount
16534 {
16535 int32 damageLeft = triggeredByAura->GetAmount();
16536 // No damage left
16537 if (damageLeft < int32(damage))
16538 i->aura->Remove();
16539 else
16540 triggeredByAura->SetAmount(damageLeft - damage);
16541 }
16542 break;
16543 }
16545 if (procSpellInfo && procSpellInfo->Id == 20647) // hack for warriors execute, both dummy and damage spell are affected by ignore aurastate aura
16546 break;
16547 takeCharges = true;
16548 break;
16551 {
16552 if (triggeredByAura->GetSpellModifier())
16553 {
16554 // Do proc if mod is consumed by spell
16555 if (!procSpell || procSpell->m_appliedMods.find(i->aura) != procSpell->m_appliedMods.end())
16556 {
16557 takeCharges = true;
16558 }
16559 }
16560 break;
16561 }
16562 default:
16563 takeCharges = true;
16564 break;
16565 }
16566 i->aura->CallScriptAfterEffectProcHandlers(triggeredByAura, aurApp, eventInfo);
16567 }
16568 // Remove charge (aura can be removed by triggers)
16569 // xinef: take into account attribute6 of proc spell
16570 if (prepare && useCharges && takeCharges)
16571 if (!procSpellInfo || isVictim || !procSpellInfo->HasAttribute(SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES))
16572 i->aura->DropCharge();
16573
16574 i->aura->CallScriptAfterProcHandlers(aurApp, eventInfo);
16575
16577 SetCantProc(false);
16578 }
16579
16580 // Cleanup proc requirements
16582 SetCantProc(false);
16583}
@ CONDITION_SOURCE_TYPE_SPELL_PROC
Definition ConditionMgr.h:147
@ EFFECT_2
Definition SharedDefines.h:33
@ SPELL_ATTR3_INSTANT_TARGET_PROCS
Definition SharedDefines.h:512
#define EFFECT_ALL
Definition SharedDefines.h:38
@ SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES
Definition SharedDefines.h:609
@ SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE
Definition SpellAuraDefines.h:288
@ SPELL_AURA_ADD_PCT_MODIFIER
Definition SpellAuraDefines.h:171
@ SPELL_AURA_OBS_MOD_POWER
Definition SpellAuraDefines.h:84
@ SPELL_AURA_ADD_FLAT_MODIFIER
Definition SpellAuraDefines.h:170
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE
Definition SpellAuraDefines.h:120
@ SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT
Definition SpellAuraDefines.h:135
@ SPELL_AURA_MOD_POWER_COST_SCHOOL
Definition SpellAuraDefines.h:136
@ SPELL_AURA_MECHANIC_IMMUNITY
Definition SpellAuraDefines.h:140
@ SPELL_AURA_RAID_PROC_FROM_CHARGE
Definition SpellAuraDefines.h:286
@ SPELL_AURA_PROC_TRIGGER_DAMAGE
Definition SpellAuraDefines.h:106
@ SPELL_AURA_REFLECT_SPELLS_SCHOOL
Definition SpellAuraDefines.h:137
@ SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK
Definition SpellAuraDefines.h:128
@ PROC_HIT_CRITICAL
Definition SpellMgr.h:253
#define MELEE_BASED_TRIGGER_MASK
Definition SpellMgr.h:182
@ PROC_EX_INTERNAL_CANT_PROC
Definition SpellMgr.h:218
@ PROC_FLAG_DONE_PERIODIC
Definition SpellMgr.h:134
static bool isNonTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:105
static bool isTriggerAura[TOTAL_AURAS]
Definition Unit.cpp:103
std::list< ProcTriggeredData > ProcTriggeredList
Definition Unit.cpp:15930
@ REACTIVE_OVERPOWER
Definition Unit.h:597
@ REACTIVE_DEFENSE
Definition Unit.h:595
@ REACTIVE_HUNTER_PARRY
Definition Unit.h:596
@ REACTIVE_WOLVERINE_BITE
Definition Unit.h:598
void HandleProcTriggerDamageAuraProc(AuraApplication *aurApp, ProcEventInfo &eventInfo)
Definition SpellAuraEffects.cpp:7270
SpellModifier * GetSpellModifier() const
Definition SpellAuraEffects.h:52
Unit * GetUnitOwner() const
Definition SpellAuras.h:108
void UpdateCombatSkills(Unit *victim, WeaponAttackType attType, bool defence, Item *item=nullptr)
Definition PlayerUpdates.cpp:1025
Definition Unit.h:421
void SetProcCooldown(uint32 cooldown)
Definition Unit.h:455
Unit * GetActionTarget() const
Definition Unit.h:441
Unit * GetProcTarget() const
Definition Unit.h:442
bool HandleProcTriggerSpell(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, uint32 procPhase, ProcEventInfo &eventInfo)
Definition Unit.cpp:8997
bool HandleAuraRaidProcFromChargeWithValue(AuraEffect *triggeredByAura)
Definition Unit.cpp:17648
bool IsHunterPet() const
Definition Unit.h:748
bool IsTriggeredAtSpellProcEvent(Unit *victim, Aura *aura, WeaponAttackType attType, bool isVictim, bool active, SpellProcEventEntry const *&spellProcEvent, ProcEventInfo const &eventInfo)
Definition Unit.cpp:17495
bool HandleAuraProc(Unit *victim, uint32 damage, Aura *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, bool *handled)
Definition Unit.cpp:8802
virtual bool HasSpellItemCooldown(uint32, uint32) const
Definition Unit.h:1263
bool HandleDummyAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 procFlag, uint32 procEx, uint32 cooldown, ProcEventInfo const &eventInfo)
Definition Unit.cpp:6676
void StartReactiveTimer(ReactiveType reactive)
Definition Unit.h:1768
bool HandleOverrideClassScriptAuraProc(Unit *victim, uint32 damage, AuraEffect *triggeredByAura, SpellInfo const *procSpell, uint32 cooldown)
Definition Unit.cpp:9922
bool HandleAuraRaidProcFromCharge(AuraEffect *triggeredByAura)
Definition Unit.cpp:17737
Definition Unit.cpp:15911

References AddComboPoints(), ASSERT, ProcTriggeredData::aura, AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, SpellInfo::CalcCastTime(), Aura::CallScriptAfterCheckProcHandlers(), Aura::CallScriptCheckProcHandlers(), CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_ROGUE, CLASS_WARRIOR, CONDITION_SOURCE_TYPE_SPELL_PROC, EFFECT_0, EFFECT_1, EFFECT_2, EFFECT_ALL, SpellInfo::Effects, ProcTriggeredData::effMask, FORM_GHOSTWOLF, ProcEventInfo::GetActionTarget(), ProcEventInfo::GetActor(), AuraEffect::GetAmount(), GetAppliedAuras(), AuraEffect::GetAuraType(), AuraEffect::GetBase(), AuraEffect::GetCasterGUID(), Aura::GetEffect(), Object::GetGUID(), Object::GetGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), ProcEventInfo::GetProcTarget(), GetShapeshiftForm(), AuraEffect::GetSpellInfo(), AuraEffect::GetSpellModifier(), Aura::GetUnitOwner(), HandleAuraProc(), HandleAuraRaidProcFromCharge(), HandleAuraRaidProcFromChargeWithValue(), HandleDummyAuraProc(), HandleOverrideClassScriptAuraProc(), AuraEffect::HandleProcTriggerDamageAuraProc(), HandleProcTriggerSpell(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), HasSpellItemCooldown(), SpellInfo::Id, IsCharmedOwnedByPlayerOrPlayer(), IsClass(), IsHunterPet(), isNonTriggerAura, Object::IsPlayer(), isTriggerAura, IsTriggeredAtSpellProcEvent(), LOG_DEBUG, Spell::m_appliedMods, Spell::m_weaponItem, SpellInfo::ManaCost, SpellInfo::ManaCostPercentage, MAX_SPELL_EFFECTS, SpellInfo::Mechanic, MELEE_BASED_TRIGGER_MASK, ModifyAuraState(), PROC_EX_ABSORB, PROC_EX_BLOCK, PROC_EX_CRITICAL_HIT, PROC_EX_DODGE, PROC_EX_INTERNAL_CANT_PROC, PROC_EX_INTERNAL_TRIGGERED, PROC_EX_MISS, PROC_EX_NORMAL_HIT, PROC_EX_PARRY, PROC_EX_RESIST, PROC_FLAG_DONE_PERIODIC, PROC_HIT_CRITICAL, PROC_SPELL_PHASE_HIT, REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, REACTIVE_WOLVERINE_BITE, SpellInfo::SchoolMask, sConditionMgr, AuraEffect::SetAmount(), SetCantProc(), ProcEventInfo::SetProcCooldown(), SPELL_ATTR3_INSTANT_TARGET_PROCS, SPELL_ATTR4_REACTIVE_DAMAGE_PROC, SPELL_ATTR6_DO_NOT_CONSUME_RESOURCES, SPELL_AURA_ABILITY_IGNORE_AURASTATE, SPELL_AURA_ADD_FLAT_MODIFIER, SPELL_AURA_ADD_PCT_MODIFIER, SPELL_AURA_DUMMY, SPELL_AURA_MANA_SHIELD, SPELL_AURA_MECHANIC_IMMUNITY, SPELL_AURA_MOD_CASTING_SPEED_NOT_STACK, SPELL_AURA_MOD_CONFUSE, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_FEAR, SPELL_AURA_MOD_MECHANIC_RESISTANCE, SPELL_AURA_MOD_MELEE_HASTE, SPELL_AURA_MOD_POWER_COST_SCHOOL, SPELL_AURA_MOD_POWER_COST_SCHOOL_PCT, SPELL_AURA_MOD_ROOT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_STUN, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PROC_TRIGGER_DAMAGE, SPELL_AURA_PROC_TRIGGER_SPELL, SPELL_AURA_PROC_TRIGGER_SPELL_WITH_VALUE, SPELL_AURA_RAID_PROC_FROM_CHARGE, SPELL_AURA_RAID_PROC_FROM_CHARGE_WITH_VALUE, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_AURA_SPELL_MAGNET, SPELL_AURA_TRANSFORM, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, ProcTriggeredData::spellProcEvent, StartReactiveTimer(), Object::ToPlayer(), Object::ToUnit(), ProcTriggeredData::triggerSpelId, and Player::UpdateCombatSkills().

Referenced by CalcAbsorbResist(), and ProcDamageAndSpell().

◆ processDummyAuras()

float Unit::processDummyAuras ( float  TakenTotalMod) const
private
11986{
11987 // note: old code coming from TC, just extracted here to remove the code duplication + solve potential crash
11988 // see: https://github.com/TrinityCore/TrinityCore/commit/c85710e148d75450baedf6632b9ca6fd40b4148e
11989
11990 // .. taken pct: dummy auras
11991 auto const& mDummyAuras = GetAuraEffectsByType(SPELL_AURA_DUMMY);
11992 for (auto i = mDummyAuras.begin(); i != mDummyAuras.end(); ++i)
11993 {
11994 if (!(*i) || !(*i)->GetSpellInfo())
11995 {
11996 continue;
11997 }
11998
11999 if (auto spellIconId = (*i)->GetSpellInfo()->SpellIconID)
12000 {
12001 switch (spellIconId)
12002 {
12003 // Cheat Death
12004 case 2109:
12005 if ((*i)->GetMiscValue() & SPELL_SCHOOL_MASK_NORMAL)
12006 {
12007 // Patch 2.4.3: The resilience required to reach the 90% damage reduction cap
12008 // is 22.5% critical strike damage reduction, or 444 resilience.
12009 // To calculate for 90%, we multiply the 100% by 4 (22.5% * 4 = 90%)
12010 float mod = -1.0f * GetMeleeCritDamageReduction(400);
12011 AddPct(TakenTotalMod, std::max(mod, float((*i)->GetAmount())));
12012 }
12013 break;
12014 }
12015 }
12016 }
12017 return TakenTotalMod;
12018}

References AddPct(), GetAuraEffectsByType(), GetMeleeCritDamageReduction(), SPELL_AURA_DUMMY, and SPELL_SCHOOL_MASK_NORMAL.

Referenced by MeleeDamageBonusTaken(), and SpellDamageBonusTaken().

◆ ProcessPositionDataChanged()

void Unit::ProcessPositionDataChanged ( PositionFullTerrainStatus const &  data)
overridevirtual

Reimplemented from WorldObject.

4311{
4314}
virtual void ProcessTerrainStatusUpdate()
Definition Unit.cpp:4316
virtual void ProcessPositionDataChanged(PositionFullTerrainStatus const &data)
Definition Object.cpp:1155

References WorldObject::ProcessPositionDataChanged(), and ProcessTerrainStatusUpdate().

Referenced by Creature::Create().

◆ ProcessTerrainStatusUpdate()

void Unit::ProcessTerrainStatusUpdate ( )
virtual

Reimplemented in Player.

4317{
4318 if (IsCreature())
4320
4321 if (IsFlying() || (!IsControlledByPlayer()))
4322 return;
4323
4324 LiquidData const& liquidData = GetLiquidData();
4325
4326 // remove appropriate auras if we are swimming/not swimming respectively
4327 if (liquidData.Status & MAP_LIQUID_STATUS_SWIMMING)
4329 else if (!isSwimming())
4331
4332 // liquid aura handling
4333 LiquidTypeEntry const* curLiquid = nullptr;
4334 if ((liquidData.Status & MAP_LIQUID_STATUS_SWIMMING))
4335 curLiquid = sLiquidTypeStore.LookupEntry(liquidData.Entry);
4336
4337 if (curLiquid != _lastLiquid)
4338 {
4341
4342 // Set _lastLiquid before casting liquid spell to avoid infinite loops
4343 _lastLiquid = curLiquid;
4344
4346 if (curLiquid && curLiquid->SpellId && (!player || !player->IsGameMaster()))
4347 CastSpell(this, curLiquid->SpellId, true);
4348 }
4349}
DBCStorage< LiquidTypeEntry > sLiquidTypeStore(LiquidTypefmt)
@ AURA_INTERRUPT_FLAG_NOT_ABOVEWATER
Definition SpellDefines.h:50
@ AURA_INTERRUPT_FLAG_NOT_UNDERWATER
Definition SpellDefines.h:51
void UpdateMovementFlags()
Definition Creature.cpp:3453
bool isSwimming() const
Definition Unit.h:1625
bool IsFlying() const
Definition Unit.h:1627
Definition GridTerrainData.h:199
uint32 Entry
Definition GridTerrainData.h:202
Definition DBCStructure.h:1284
uint32 SpellId
Definition DBCStructure.h:1290

References _lastLiquid, AURA_INTERRUPT_FLAG_NOT_ABOVEWATER, AURA_INTERRUPT_FLAG_NOT_UNDERWATER, CastSpell(), LiquidData::Entry, GetCharmerOrOwnerPlayerOrPlayerItself(), WorldObject::GetLiquidData(), IsControlledByPlayer(), Object::IsCreature(), IsFlying(), Player::IsGameMaster(), isSwimming(), MAP_LIQUID_STATUS_SWIMMING, RemoveAurasDueToSpell(), RemoveAurasWithInterruptFlags(), sLiquidTypeStore, LiquidTypeEntry::SpellId, LiquidData::Status, Object::ToCreature(), and Creature::UpdateMovementFlags().

Referenced by ProcessPositionDataChanged(), and Player::ProcessTerrainStatusUpdate().

◆ ProhibitSpellSchool()

virtual void Unit::ProhibitSpellSchool ( SpellSchoolMask  ,
uint32   
)
inlinevirtual

Reimplemented in Creature, and Player.

1503{ }

Referenced by Spell::EffectInterruptCast().

◆ propagateSpeedChange()

void Unit::propagateSpeedChange ( )
inline
void propagateSpeedChange()
Definition MotionMaster.cpp:890

References GetMotionMaster(), and MotionMaster::propagateSpeedChange().

Referenced by SetSpeed(), and SetWalk().

◆ RecalculateObjectScale()

void Unit::RecalculateObjectScale ( )
virtual
16827{
16829 float scale = GetNativeObjectScale() + CalculatePct(1.0f, scaleAuras);
16830 float scaleMin = IsPlayer() ? 0.1f : 0.01f;
16831 SetObjectScale(std::max(scale, scaleMin));
16832}
@ SPELL_AURA_MOD_SCALE_2
Definition SpellAuraDefines.h:302
@ SPELL_AURA_MOD_SCALE
Definition SpellAuraDefines.h:124
virtual void SetObjectScale(float scale)
Definition Object.h:120
virtual float GetNativeObjectScale() const
Definition Unit.h:1885

References CalculatePct(), GetNativeObjectScale(), GetTotalAuraModifier(), Object::IsPlayer(), Object::SetObjectScale(), SPELL_AURA_MOD_SCALE, and SPELL_AURA_MOD_SCALE_2.

Referenced by AuraEffect::HandleAuraModScale().

◆ RemoveAllAttackers()

void Unit::RemoveAllAttackers ( )

Remove all units in m_attackers list and send them AttackStop()

10571{
10572 while (!m_attackers.empty())
10573 {
10574 AttackerSet::iterator iter = m_attackers.begin();
10575 if (!(*iter)->AttackStop())
10576 {
10577 LOG_ERROR("entities.unit", "WORLD: Unit has an attacker that isn't attacking it!");
10578 m_attackers.erase(iter);
10579 }
10580 }
10581}

References LOG_ERROR, and m_attackers.

Referenced by CombatStop(), Spell::EffectSanctuary(), boss_kaelthas::ExecuteMiddleEvent(), AuraEffect::HandleFeignDeath(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), spell_halion_twilight_phasing_aura::OnApply(), spell_halion_twilight_phasing_aura::OnRemove(), boss_attumen::SpellHit(), and npc_qiraj_war_spawn::npc_qiraj_war_spawnAI::UpdateAI().

◆ RemoveAllAuras()

void Unit::RemoveAllAuras ( )
5376{
5377 // this may be a dead loop if some events on aura remove will continiously apply aura on remove
5378 // we want to have all auras removed, so use your brain when linking events
5379 while (!m_appliedAuras.empty() || !m_ownedAuras.empty())
5380 {
5381 AuraApplicationMap::iterator aurAppIter;
5382 for (aurAppIter = m_appliedAuras.begin(); aurAppIter != m_appliedAuras.end();)
5384
5385 AuraMap::iterator aurIter;
5386 for (aurIter = m_ownedAuras.begin(); aurIter != m_ownedAuras.end();)
5387 RemoveOwnedAura(aurIter);
5388 }
5389}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by CleanupBeforeRemoveFromMap(), boss_muru::DamageTaken(), boss_headless_horseman_head::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), boss_taldaram::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), boss_leotheras_the_blind::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_anubarak_spike::npc_anubarak_spikeAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), boss_razorgore::boss_razorgoreAI::DoChangePhase(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_mimiron::boss_mimironAI::EnterEvadeMode(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::EnterEvadeMode(), npc_ulduar_vx001::npc_ulduar_vx001AI::EnterEvadeMode(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::EnterEvadeMode(), GuardAI::EnterEvadeMode(), boss_doomrel::boss_doomrelAI::EnterEvadeMode(), FollowerAI::EnterEvadeMode(), LichKingDeathEvent::Execute(), spell_herald_volzaj_insanity::HandleDummyEffect(), misc_commandscript::HandleUnAuraCommand(), boss_ick::boss_ickAI::JustDied(), boss_venoxis::JustDied(), boss_taldaram::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_high_botanist_freywinn::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_professor_putricide::boss_professor_putricideAI::JustEngagedWith(), boss_commander_stoutbeard::JustEngagedWith(), boss_high_astromancer_solarian::JustEngagedWith(), boss_steelbreaker::boss_steelbreakerAI::JustReachedHome(), boss_runemaster_molgeim::boss_runemaster_molgeimAI::JustReachedHome(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::JustReachedHome(), boss_urom::boss_uromAI::LeaveCombat(), boss_taldaram::MovementInform(), npc_hallows_end_soh::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), spell_kaelthas_flame_strike::OnRemove(), PretendToDie(), boss_alar::PretendToDie(), Creature::RemoveCorpse(), boss_venoxis::Reset(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_bjarngrim::boss_bjarngrimAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_hodir::boss_hodirAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_skadi::boss_skadiAI::Reset(), boss_skadi_grauf::boss_skadi_graufAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), Pet::SavePetToDB(), npc_anubarak_spike::npc_anubarak_spikeAI::SelectNewTarget(), npc_harrison_jones::SpellHit(), npc_frost_sphere::npc_frost_sphereAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_soh_fire_trigger::SpellHit(), npc_hallows_end_train_fire::SpellHit(), boss_headless_horseman_head::SpellHit(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_lk_spirit_bomb::npc_lk_spirit_bombAI::UpdateAI(), npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_magus_telestra::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_iron_watcher::npc_iron_watcherAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), and npc_aeranas::npc_aeranasAI::UpdateAI().

◆ RemoveAllAurasExceptType()

void Unit::RemoveAllAurasExceptType ( AuraType  type)
5450{
5451 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5452 {
5453 Aura const* aura = iter->second->GetBase();
5454 if (aura->GetSpellInfo()->HasAura(type))
5455 ++iter;
5456 else
5458 }
5459
5460 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5461 {
5462 Aura* aura = iter->second;
5463 if (aura->GetSpellInfo()->HasAura(type))
5464 ++iter;
5465 else
5467 }
5468}

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), SpellInfo::HasAura(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), and npc_iron_watcher::npc_iron_watcherAI::SpellHit().

◆ RemoveAllAurasOnDeath()

void Unit::RemoveAllAurasOnDeath ( )
5406{
5407 // used just after dieing to remove all visible auras
5408 // and disable the mods for the passive ones
5409 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5410 {
5411 Aura const* aura = iter->second->GetBase();
5414 else
5415 ++iter;
5416 }
5417
5418 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5419 {
5420 Aura* aura = iter->second;
5423 else
5424 ++iter;
5425 }
5426}
@ SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD
Definition SharedDefines.h:643
@ AURA_REMOVE_BY_DEATH
Definition SpellAuraDefines.h:396
bool IsDeathPersistent() const
Definition SpellAuras.cpp:1087

References _UnapplyAura(), AURA_REMOVE_BY_DEATH, Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsDeathPersistent(), Aura::IsPassive(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), and SPELL_ATTR7_DISABLE_AURA_WHILE_DEAD.

Referenced by spell_dk_death_pact::FilterTargets(), Kill(), Player::LoadFromDB(), and setDeathState().

◆ RemoveAllAurasRequiringDeadTarget()

void Unit::RemoveAllAurasRequiringDeadTarget ( )
5429{
5430 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5431 {
5432 Aura const* aura = iter->second->GetBase();
5433 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5435 else
5436 ++iter;
5437 }
5438
5439 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5440 {
5441 Aura* aura = iter->second;
5442 if (!aura->IsPassive() && aura->GetSpellInfo()->IsRequiringDeadTarget())
5444 else
5445 ++iter;
5446 }
5447}
bool IsRequiringDeadTarget() const
Definition SpellInfo.cpp:1222

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, Aura::GetSpellInfo(), Aura::IsPassive(), SpellInfo::IsRequiringDeadTarget(), m_appliedAuras, m_ownedAuras, and RemoveOwnedAura().

Referenced by Player::LoadFromDB().

◆ RemoveAllControlled()

void Unit::RemoveAllControlled ( bool  onDeath = false)
11173{
11174 // possessed pet and vehicle
11175 if (IsPlayer())
11177
11178 while (!m_Controlled.empty())
11179 {
11180 Unit* target = *m_Controlled.begin();
11181 m_Controlled.erase(m_Controlled.begin());
11182 if (target->GetCharmerGUID() == GetGUID())
11183 {
11184 target->RemoveCharmAuras();
11185 }
11186 else if (target->GetOwnerGUID() == GetGUID() && target->IsSummon())
11187 {
11188 if (!(onDeath && !IsPlayer() && target->IsGuardian()))
11189 {
11190 target->ToTempSummon()->UnSummon();
11191 }
11192 }
11193 else
11194 {
11195 LOG_ERROR("entities.unit", "Unit {} is trying to release unit {} which is neither charmed nor owned by it", GetEntry(), target->GetEntry());
11196 }
11197 }
11198}
void StopCastingCharm(Aura *except=nullptr)
Definition Player.cpp:9325
bool IsGuardian() const
Definition Unit.h:745
void RemoveCharmAuras()
Definition Unit.cpp:11280

References GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwnerGUID(), IsGuardian(), Object::IsPlayer(), IsSummon(), LOG_ERROR, m_Controlled, RemoveCharmAuras(), Player::StopCastingCharm(), Object::ToPlayer(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ RemoveAllDynObjects()

void Unit::RemoveAllDynObjects ( )
6251{
6252 while (!m_dynObj.empty())
6253 m_dynObj.front()->Remove();
6254}

References m_dynObj.

Referenced by RemoveFromWorld(), Player::TeleportTo(), and npc_icc_putricades_trap::npc_icc_putricades_trapAI::UpdateAI().

◆ RemoveAllGameObjects()

void Unit::RemoveAllGameObjects ( )
6351{
6352 while(!m_gameObj.empty())
6353 {
6354 GameObject* go = ObjectAccessor::GetGameObject(*this, *m_gameObj.begin());
6355 if (go)
6356 {
6358 go->SetRespawnTime(0);
6359 go->Delete();
6360 }
6361 m_gameObj.erase(m_gameObj.begin());
6362 }
6363}
void Delete()
Definition GameObject.cpp:982
void SetRespawnTime(int32 respawn)
Definition GameObject.cpp:1288

References GameObject::Delete(), ObjectGuid::Empty, ObjectAccessor::GetGameObject(), m_gameObj, GameObject::SetOwnerGUID(), and GameObject::SetRespawnTime().

Referenced by CleanupBeforeRemoveFromMap(), npc_ice_tomb::npc_ice_tombAI::JustDied(), RemoveFromWorld(), npc_brewfest_super_brew_trigger::UpdateAI(), and boss_sapphiron::boss_sapphironAI::UpdateAI().

◆ RemoveAllMinionsByEntry()

void Unit::RemoveAllMinionsByEntry ( uint32  entry)
10950{
10951 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
10952 {
10953 Unit* unit = *itr;
10954 ++itr;
10955 if (unit->GetEntry() == entry && unit->IsCreature()
10956 && unit->ToCreature()->IsSummon()) // minion, actually
10957 unit->ToTempSummon()->UnSummon();
10958 // i think this is safe because i have never heard that a despawned minion will trigger a same minion
10959 }
10960}

References Object::GetEntry(), Object::IsCreature(), IsSummon(), m_Controlled, Object::ToCreature(), ToTempSummon(), and TempSummon::UnSummon().

Referenced by Spell::EffectSummonType(), npc_nelson::npc_nelsonAI::Reset(), SetMinion(), and npc_nelson::npc_nelsonAI::UpdateAI().

◆ RemoveAppliedAuras() [1/2]

void Unit::RemoveAppliedAuras ( std::function< bool(AuraApplication const *)> const &  check)
4927{
4928 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
4929 {
4930 if (check(iter->second))
4931 {
4932 RemoveAura(iter);
4933 continue;
4934 }
4935 ++iter;
4936 }
4937}

References m_appliedAuras, and RemoveAura().

Referenced by RemoveArenaAuras().

◆ RemoveAppliedAuras() [2/2]

void Unit::RemoveAppliedAuras ( uint32  spellId,
std::function< bool(AuraApplication const *)> const &  check 
)
4953{
4954 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4955 {
4956 if (check(iter->second))
4957 {
4958 RemoveAura(iter);
4959 continue;
4960 }
4961 ++iter;
4962 }
4963}

References m_appliedAuras, and RemoveAura().

◆ RemoveAreaAurasDueToLeaveWorld()

void Unit::RemoveAreaAurasDueToLeaveWorld ( )
5343{
5344 // make sure that all area auras not applied on self are removed - prevent access to deleted pointer later
5345 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5346 {
5347 Aura* aura = iter->second;
5348 ++iter;
5349 Aura::ApplicationMap const& appMap = aura->GetApplicationMap();
5350 for (Aura::ApplicationMap::const_iterator itr = appMap.begin(); itr != appMap.end();)
5351 {
5352 AuraApplication* aurApp = itr->second;
5353 ++itr;
5354 Unit* target = aurApp->GetTarget();
5355 if (target == this)
5356 continue;
5357 target->RemoveAura(aurApp);
5358 // things linked on aura remove may apply new area aura - so start from the beginning
5359 iter = m_ownedAuras.begin();
5360 }
5361 }
5362
5363 // remove area auras owned by others
5364 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5365 {
5366 if (iter->second->GetBase()->GetOwner() != this)
5367 {
5368 RemoveAura(iter);
5369 }
5370 else
5371 ++iter;
5372 }
5373}
ApplicationMap const & GetApplicationMap()
Definition SpellAuras.h:181
std::map< ObjectGuid, AuraApplication * > ApplicationMap
Definition SpellAuras.h:90

References Aura::GetApplicationMap(), AuraApplication::GetTarget(), m_appliedAuras, m_ownedAuras, and RemoveAura().

Referenced by RemoveFromWorld().

◆ RemoveArenaAuras()

void Unit::RemoveArenaAuras ( )
5392{
5393 // in join, remove positive buffs, on end, remove negative
5394 // used to remove positive visible auras in arenas
5395 RemoveAppliedAuras([](AuraApplication const* aurApp)
5396 {
5397 Aura const* aura = aurApp->GetBase();
5398 return (!aura->GetSpellInfo()->HasAttribute(SPELL_ATTR4_ALLOW_ENETRING_ARENA) // don't remove stances, shadowform, pally/hunter auras
5399 && !aura->IsPassive() // don't remove passive auras
5400 && (aurApp->IsPositive() || !aura->GetSpellInfo()->HasAttribute(SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD))) || // not negative death persistent auras
5401 aura->GetSpellInfo()->HasAttribute(SPELL_ATTR5_REMOVE_ENTERING_ARENA); // special marker, always remove
5402 });
5403}
@ SPELL_ATTR5_REMOVE_ENTERING_ARENA
Definition SharedDefines.h:569
@ SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD
Definition SharedDefines.h:513
@ SPELL_ATTR4_ALLOW_ENETRING_ARENA
Definition SharedDefines.h:551
bool IsPositive() const
Definition SpellAuras.h:68
void RemoveAppliedAuras(std::function< bool(AuraApplication const *)> const &check)
Definition Unit.cpp:4926

References AuraApplication::GetBase(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), Aura::IsPassive(), AuraApplication::IsPositive(), RemoveAppliedAuras(), SPELL_ATTR3_ALLOW_AURA_WHILE_DEAD, SPELL_ATTR4_ALLOW_ENETRING_ARENA, and SPELL_ATTR5_REMOVE_ENTERING_ARENA.

Referenced by Player::TeleportTo().

◆ RemoveAura() [1/4]

void Unit::RemoveAura ( Aura aur,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4906{
4907 if (aura->IsRemoved())
4908 return;
4909 if (AuraApplication* aurApp = aura->GetApplicationOfTarget(GetGUID()))
4910 RemoveAura(aurApp, mode);
4911}

References Aura::GetApplicationOfTarget(), Object::GetGUID(), Aura::IsRemoved(), and RemoveAura().

◆ RemoveAura() [2/4]

void Unit::RemoveAura ( AuraApplication aurApp,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4863{
4864 // we've special situation here, RemoveAura called while during aura removal
4865 // this kind of call is needed only when aura effect removal handler
4866 // or event triggered by it expects to remove
4867 // not yet removed effects of an aura
4868 if (aurApp->GetRemoveMode())
4869 {
4870 // remove remaining effects of an aura
4871 for (uint8 itr = 0; itr < MAX_SPELL_EFFECTS; ++itr)
4872 {
4873 if (aurApp->HasEffect(itr))
4874 aurApp->_HandleEffect(itr, false);
4875 }
4876 return;
4877 }
4878 // no need to remove
4879 if (aurApp->GetBase()->GetApplicationOfTarget(GetGUID()) != aurApp || aurApp->GetBase()->IsRemoved())
4880 return;
4881
4882 uint32 spellId = aurApp->GetBase()->GetId();
4883 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4884
4885 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4886 {
4887 if (aurApp == iter->second)
4888 {
4889 // Prevent Arena Preparation aura from being removed by player actions
4890 // It's an invisibility spell so any interaction/spell cast etc. removes it.
4891 // Should only be removed by the arena script, once the match starts.
4893 {
4894 return;
4895 }
4896
4897 RemoveAura(iter, mode);
4898 return;
4899 }
4900 else
4901 ++iter;
4902 }
4903}
@ SPELL_AURA_ARENA_PREPARATION
Definition SpellAuraDefines.h:278

References AuraApplication::_HandleEffect(), Aura::GetApplicationOfTarget(), AuraApplication::GetBase(), Object::GetGUID(), Aura::GetId(), AuraApplication::GetRemoveMode(), AuraApplication::HasEffect(), Aura::HasEffectType(), Aura::IsRemoved(), m_appliedAuras, MAX_SPELL_EFFECTS, RemoveAura(), and SPELL_AURA_ARENA_PREPARATION.

◆ RemoveAura() [3/4]

void Unit::RemoveAura ( AuraApplicationMap::iterator &  i,
AuraRemoveMode  mode = AURA_REMOVE_BY_DEFAULT 
)
4833{
4834 AuraApplication* aurApp = i->second;
4835 // Do not remove aura which is already being removed
4836 if (aurApp->GetRemoveMode())
4837 return;
4838 Aura* aura = aurApp->GetBase();
4839 _UnapplyAura(i, mode);
4840 // Remove aura - for Area and Target auras
4841 if (aura->GetOwner() == this)
4842 aura->Remove(mode);
4843}

References _UnapplyAura(), AuraApplication::GetBase(), Aura::GetOwner(), AuraApplication::GetRemoveMode(), and Aura::Remove().

Referenced by _RemoveNoStackAurasDueToAura(), boss_marli::_schedulePhaseTroll(), ApplySpellDispelImmunity(), Player::CheckAreaExploreAndOutdoor(), boss_headless_horseman::DamageTaken(), npc_power_spark::npc_power_sparkAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_hor_lich_king::npc_hor_lich_kingAI::DoAction(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), npc_harrison_jones::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_pilgrims_bounty_chair::DoAction(), boss_paletress::boss_paletressAI::DoAction(), boss_vezax::boss_vezaxAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_yoggsaron_crusher_tentacle::boss_yoggsaron_crusher_tentacleAI::DoAction(), boss_yoggsaron_corruptor_tentacle::boss_yoggsaron_corruptor_tentacleAI::DoAction(), boss_yoggsaron_constrictor_tentacle::boss_yoggsaron_constrictor_tentacleAI::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), Player::DuelComplete(), Spell::EffectDispelMechanic(), Spell::EffectForceCast(), Spell::EffectHeal(), Spell::EffectSummonPet(), Spell::EffectTriggerSpell(), npc_thrall_bfu::npc_thrall_bfuAI::EnterEvadeMode(), Spell::finish(), GetDiseasesByCaster(), AuraEffect::HandleAuraLinked(), AuraEffect::HandleAuraModSchoolImmunity(), Aura::HandleAuraSpecificMods(), deserter_commandscript::HandleDeserterRemove(), deserter_commandscript::HandleDeserterRemoveAll(), spell_q12096_q12092_bark::HandleDummy(), spell_valanar_kinetic_bomb_aura::HandleDummyTick(), spell_warl_demonic_circle_summon::HandleDummyTick(), spell_midsummer_ribbon_pole::HandleEffectPeriodic(), spell_dk_improved_blood_presence::HandleEffectRemove(), spell_dk_improved_frost_presence::HandleEffectRemove(), spell_dk_improved_unholy_presence::HandleEffectRemove(), spell_dk_presence::HandleEffectRemove(), spell_pal_blessing_of_sanctuary::HandleEffectRemove(), spell_sha_chain_heal::HandleHeal(), spell_sindragosa_frost_breath::HandleInfusion(), spell_warl_demonic_circle_summon::HandleRemove(), spell_putricide_eat_ooze::HandleScript(), AuraEffect::HandleShapeshiftBoosts(), npc_zulian_prowler::npc_zulian_prowlerAI::JustEngagedWith(), boss_jaraxxus::boss_jaraxxusAI::JustEngagedWith(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::JustEngagedWith(), npc_ulduar_snow_mound::MoveInLineOfSight(), spell_blood_queen_vampiric_bite::OnCast(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), npc_essence_of_twin::OnGossipHello(), spell_love_is_in_the_air_romantic_picnic::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), npc_thrall_bfu::OnQuestReward(), npc_vortex_ride::npc_vortex_rideAI::PassengerBoarded(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), BattlefieldWG::PromotePlayer(), RemoveAppliedAuras(), RemoveAppliedAuras(), RemoveAreaAurasDueToLeaveWorld(), RemoveAura(), RemoveAura(), RemoveAura(), RemoveAurasByShapeShift(), RemoveAurasByType(), RemoveAurasDueToItemSpell(), RemoveAurasDueToSpell(), RemoveAurasWithAttribute(), RemoveAurasWithFamily(), RemoveAurasWithInterruptFlags(), RemoveAurasWithMechanic(), RemoveMovementImpairingAuras(), BattlegroundIC::RemovePlayer(), BattlegroundMap::RemovePlayerFromMap(), boss_bjarngrim::boss_bjarngrimAI::RemoveStanceAura(), boss_gyth::boss_gythAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_marli::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_varos::boss_varosAI::Reset(), NPCStaveQuestAI::ResetState(), boss_anomalus::SetData(), boss_hodir::boss_hodirAI::SmallIcicles(), boss_malygos::boss_malygosAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_nelson::npc_nelsonAI::SpellHit(), boss_headless_horseman::SpellHit(), boss_viscidus::SpellHit(), spell_pal_hand_of_sacrifice_aura::Split(), boss_sartharion_shadron::boss_sartharion_shadronAI::SummonedCreatureDies(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), boss_headless_horseman::UpdateAI(), npc_onyxian_lair_guard::UpdateAI(), boss_viscidus::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_freya::boss_freyaAI::UpdateAI(), boss_freya_elder_brightleaf::boss_freya_elder_brightleafAI::UpdateAI(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), Spell::UpdateChanneledTargetList(), and boss_bjarngrim::boss_bjarngrimAI::WaypointReached().

◆ RemoveAura() [4/4]

void Unit::RemoveAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4846{
4847 AuraApplicationMapBoundsNonConst range = m_appliedAuras.equal_range(spellId);
4848 for (AuraApplicationMap::iterator iter = range.first; iter != range.second;)
4849 {
4850 Aura const* aura = iter->second->GetBase();
4851 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4852 && (!caster || aura->GetCasterGUID() == caster))
4853 {
4854 RemoveAura(iter, removeMode);
4855 return;
4856 }
4857 else
4858 ++iter;
4859 }
4860}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

◆ RemoveAuraFromStack()

void Unit::RemoveAuraFromStack ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4982{
4983 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4984 for (AuraMap::iterator iter = range.first; iter != range.second;)
4985 {
4986 Aura* aura = iter->second;
4987 if ((aura->GetType() == UNIT_AURA_TYPE)
4988 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4989 {
4990 aura->ModStackAmount(-1, removeMode);
4991 return;
4992 }
4993 else
4994 ++iter;
4995 }
4996}
@ UNIT_AURA_TYPE
Definition SpellAuraDefines.h:385
bool ModStackAmount(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT, bool periodicReset=false)
Definition SpellAuras.cpp:1021
AuraObjectType GetType() const
Definition SpellAuras.cpp:481

References Aura::GetCasterGUID(), Aura::GetType(), m_ownedAuras, Aura::ModStackAmount(), and UNIT_AURA_TYPE.

Referenced by Spell::EffectSchoolDMG(), HandleAuraProc(), HandleDummyAuraProc(), spell_putricide_gaseous_bloat_aura::HandleExtraEffect(), spell_oculus_evasive_maneuvers_aura::HandleProc(), spell_dk_scent_of_blood::HandleProc(), spell_item_brittle_armor::HandleScript(), spell_item_mercurial_shield::HandleScript(), boss_selin_fireheart::JustEngagedWith(), and boss_viscidus::SpellHit().

◆ RemoveAurasByShapeShift()

void Unit::RemoveAurasByShapeShift ( )
5327{
5328 uint32 mechanic_mask = (1 << MECHANIC_SNARE) | (1 << MECHANIC_ROOT);
5329 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5330 {
5331 Aura const* aura = iter->second->GetBase();
5332 if ((aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask) &&
5334 {
5335 RemoveAura(iter);
5336 continue;
5337 }
5338 ++iter;
5339 }
5340}
@ SPELL_ATTR0_CU_AURA_CC
Definition SpellInfo.h:181
uint32 GetAllEffectsMechanicMask() const
Definition SpellInfo.cpp:2003

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), m_appliedAuras, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), SPELL_ATTR0_CU_AURA_CC, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by AuraEffect::HandleAuraModShapeshift().

◆ RemoveAurasByType()

void Unit::RemoveAurasByType ( AuraType  auraType,
ObjectGuid  casterGUID = ObjectGuid::Empty,
Aura except = nullptr,
bool  negative = true,
bool  positive = true 
)
5167{
5168 // simple check if list is empty
5169 if (m_modAuras[auraType].empty())
5170 return;
5171
5172 for (AuraEffectList::iterator iter = m_modAuras[auraType].begin(); iter != m_modAuras[auraType].end();)
5173 {
5174 Aura* aura = (*iter)->GetBase();
5176
5177 ++iter;
5178 if (aura != except && (!casterGUID || aura->GetCasterGUID() == casterGUID)
5179 && ((negative && !aurApp->IsPositive()) || (positive && aurApp->IsPositive())))
5180 {
5181 uint32 removedAuras = m_removedAurasCount;
5182 RemoveAura(aurApp);
5183 if (m_removedAurasCount > removedAuras)
5184 iter = m_modAuras[auraType].begin();
5185 }
5186 }
5187}

References Aura::GetApplicationOfTarget(), Aura::GetCasterGUID(), Object::GetGUID(), AuraApplication::IsPositive(), m_modAuras, m_removedAurasCount, and RemoveAura().

Referenced by _EnterVehicle(), Spell::_handle_finish_phase(), Player::ActivateTaxiPathTo(), Battleground::AddPlayer(), Attack(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::BeforeSpellClick(), spell_gen_summon_tournament_mount::CheckIfLanceEquipped(), ClearComboPoints(), Player::ContinueTaxiFlight(), boss_kologarn_arms::boss_kologarn_armsAI::DamageTaken(), Spell::DoSpellHitOnUnit(), Spell::EffectPowerBurn(), Spell::EffectTriggerSpell(), BattlegroundWS::EventPlayerClickedOnFlag(), ExitVehicle(), WorldSession::HandleAuctionHelloOpcode(), WorldSession::HandleAuctionListBidderItems(), WorldSession::HandleAuctionListItems(), WorldSession::HandleAuctionListOwnerItems(), WorldSession::HandleAuctionPlaceBid(), WorldSession::HandleAuctionRemoveItem(), WorldSession::HandleAuctionSellItem(), spell_warl_seduction::HandleAuraApply(), AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraModStateImmunity(), AuraEffect::HandleAuraMounted(), AuraEffect::HandleAuraTransform(), WorldSession::HandleBankerActivateOpcode(), WorldSession::HandleBinderActivateOpcode(), WorldSession::HandleBuybackItem(), WorldSession::HandleBuyStableSlot(), WorldSession::HandleCancelMountAuraOpcode(), misc_commandscript::HandleDismountCommand(), spell_item_reindeer_transformation::HandleDummy(), spell_item_brewfest_mount_transformation::HandleDummy(), HandleDummyAuraProc(), spell_rog_vanish::HandleEffect(), spell_hydross_mark_of_hydross::HandleEffectApply(), WorldSession::HandleGossipSelectOptionOpcode(), WorldSession::HandleListStabledPetsOpcode(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), WorldSession::HandleMoveWorldportAck(), spell_oculus_rider_aura::HandleOnEffectApply(), spell_algalon_remove_phase_aura::HandlePeriodic(), WorldSession::HandlePetitionBuyOpcode(), WorldSession::HandleQuestgiverHelloOpcode(), WorldSession::HandleRepairItemOpcode(), WorldSession::HandleSaveGuildEmblemOpcode(), spell_gen_mine_sweeper::HandleSchoolDMG(), WorldSession::HandleSellItemOpcode(), WorldSession::HandleSpiritHealerActivateOpcode(), WorldSession::HandleStablePet(), WorldSession::HandleStableSwapPet(), WorldSession::HandleTabardVendorActivateOpcode(), WorldSession::HandleTalentWipeConfirmOpcode(), WorldSession::HandleTaxiQueryAvailableNodes(), WorldSession::HandleTrainerBuySpellOpcode(), WorldSession::HandleUnstablePet(), boss_gurtogg_bloodboil::JustEngagedWith(), Player::LeaveBattleground(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), spell_gen_aura_service_uniform::OnApply(), Player::ProcessDelayedOperations(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), Vehicle::RemoveAllPassengers(), RemoveBindSightAuras(), RemoveCharmAuras(), Battleground::RemovePlayerAtLeave(), WorldSession::SendDoFlight(), WorldSession::SendListInventory(), Player::SendLoot(), WorldSession::SendTrainerList(), SetCharmedBy(), Player::StopCastingCharm(), Player::TeleportTo(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), GameObject::Use(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ RemoveAurasDueToItemSpell()

void Unit::RemoveAurasDueToItemSpell ( uint32  spellId,
ObjectGuid  castItemGuid 
)
5142{
5143 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
5144 {
5145 if (iter->second->GetBase()->GetCastItemGUID() == castItemGuid)
5146 {
5147 RemoveAura(iter);
5148 iter = m_appliedAuras.lower_bound(spellId);
5149 }
5150 else
5151 ++iter;
5152 }
5153
5154 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
5155 {
5156 if (iter->second->GetCastItemGUID() == castItemGuid)
5157 {
5159 iter = m_ownedAuras.lower_bound(spellId);
5160 }
5161 else
5162 ++iter;
5163 }
5164}

References AURA_REMOVE_BY_DEFAULT, m_appliedAuras, m_ownedAuras, RemoveAura(), and RemoveOwnedAura().

Referenced by Player::ApplyEnchantment(), and Player::ApplyEquipSpell().

◆ RemoveAurasDueToSpell()

void Unit::RemoveAurasDueToSpell ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4966{
4967 for (AuraApplicationMap::iterator iter = m_appliedAuras.lower_bound(spellId); iter != m_appliedAuras.upper_bound(spellId);)
4968 {
4969 Aura const* aura = iter->second->GetBase();
4970 if (((aura->GetEffectMask() & reqEffMask) == reqEffMask)
4971 && (!casterGUID || aura->GetCasterGUID() == casterGUID))
4972 {
4973 RemoveAura(iter, removeMode);
4974 iter = m_appliedAuras.lower_bound(spellId);
4975 }
4976 else
4977 ++iter;
4978 }
4979}

References Aura::GetCasterGUID(), Aura::GetEffectMask(), m_appliedAuras, and RemoveAura().

Referenced by Spell::_cast(), Player::_removeTalentAurasAndSpells(), Player::ActivateSpec(), Vehicle::AddPassenger(), spell_commander_sarannis_arcane_devastation::AfterApply(), spell_dru_feral_swiftness::AfterRemove(), spell_dru_barkskin::AfterRemove(), spell_dru_savage_roar_aura::AfterRemove(), spell_dru_survival_instincts_aura::AfterRemove(), Player::ApplyEquipSpell(), boss_hakkar::boss_hakkarAI::ApplyHakkarPowerStacks(), boss_buru::ChaseNewVictim(), spell_eredar_twins_handle_touch::CheckCast(), boss_volazj::CheckPhaseMinions(), spell_botanica_shift_form_aura::CheckProc(), spell_mage_burning_determination::CheckProc(), boss_isle_of_conquest::boss_isle_of_conquestAI::CheckRageBuff(), Player::CleanupAfterTaxiFlight(), AuraEffect::CleanupTriggeredSpells(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), spell_ruby_sanctum_rallying_shout::CountAllies(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_buru::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_leotheras_the_blind::DemonTime(), Player::DestroyItem(), WorldState::DispelAdalsSongOfBattle(), WorldState::DispelMagtheridonTeam(), npc_drakonid_spawner::DoAction(), npc_twilight_volunteer::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_frozen_core::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_ambassador_hellmaw::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), npc_pet_gen_argent_pony_bridle::DoAction(), boss_alar::DoDiveBomb(), InstanceScript::DoRemoveAurasDueToSpellOnPlayers(), Spell::DoTriggersOnSpellHit(), Spell::EffectApplyGlyph(), Spell::EffectHeal(), Spell::EffectRemoveAura(), Spell::EffectSchoolDMG(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_zuljin::EnterPhase(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerDroppedFlag(), BattlegroundWS::EventPlayerDroppedFlag(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), BattleExperienceEvent::Execute(), SendEncounterUnit::Execute(), FrostBombExplosion::Execute(), AuraRemoveEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), spell_sindragosa_ice_tomb_trap_aura::ExtraRemoveEffect(), spell_mother_shahraz_fatal_attraction_dummy::FilterTargets(), spell_warr_improved_spell_reflection_trigger::FilterTargets(), lfg::LFGMgr::FinishDungeon(), spell_dru_berserk::HandleAfterCast(), spell_capacitus_polarity_charge_aura::HandleAfterRemove(), spell_amanitar_remove_mushroom_power::HandleApply(), BattlegroundDS::HandleAreaTrigger(), OutdoorPvPSI::HandleAreaTrigger(), AuraEffect::HandleAuraControlVehicle(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModShapeshift(), Aura::HandleAuraSpecificMods(), spell_moroes_vanish::HandleDummy(), spell_fight_fire_bomber::HandleDummy(), spell_q13007_iron_colossus::HandleDummy(), spell_pilgrims_bounty_feast_on_generic::HandleDummy(), spell_ahn_kahet_swarmer_aura::HandleDummy(), spell_halion_twilight_division::HandleDummy(), spell_putricide_ooze_eruption_searcher::HandleDummy(), spell_warhead_detonate::HandleDummy(), spell_dru_starfall_dummy::HandleDummy(), HandleDummyAuraProc(), spell_magtheridon_shadow_grasp_visual::HandleDummyRemove(), spell_shadowfang_keep_forsaken_skills_aura::HandleDummyTick(), spell_oculus_soar_aura::HandleEffectPeriodic(), spell_q12730_quenching_mist::HandleEffectPeriodic(), spell_rog_prey_on_the_weak::HandleEffectPeriodic(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_reliquary_of_souls_aura_of_suffering_aura::HandleEffectRemove(), spell_serpentshrine_cavern_coilfang_water::HandleEffectRemove(), spell_q10769_dissension_amongst_the_ranks_aura::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), spell_midsummer_fling_torch::HandleFinish(), gm_commandscript::HandleGMVisibleCommand(), group_commandscript::HandleGroupReviveCommand(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), spell_transitus_shield_beam_aura::HandleOnEffectRemove(), OPvPCapturePointZM_Graveyard::HandleOpenGo(), spell_hadronox_summon_periodic_aura::HandlePeriodic(), spell_algalon_phase_punch_aura::HandlePeriodic(), spell_algalon_remove_phase_aura::HandlePeriodic(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicDummyAuraTick(), AuraEffect::HandlePeriodicTriggerSpellAuraTick(), WorldState::HandlePlayerLeaveZone(), OutdoorPvPEP::HandlePlayerLeaveZone(), OutdoorPvPHP::HandlePlayerLeaveZone(), OutdoorPvPNA::HandlePlayerLeaveZone(), OutdoorPvPSI::HandlePlayerLeaveZone(), OutdoorPvPTF::HandlePlayerLeaveZone(), OutdoorPvPZM::HandlePlayerLeaveZone(), spell_gen_consume::HandleProc(), spell_pri_t4_4p_bonus::HandleProc(), spell_item_blood_draining_enchant::HandleProc(), HandleProcTriggerSpell(), spell_icc_harvest_blight_specimen::HandleQuestComplete(), spell_felmyst_fog_of_corruption_charm_aura::HandleRemove(), spell_kiljaeden_vengeance_of_the_blue_flight_aura::HandleRemove(), spell_dru_enrage::HandleRemove(), spell_pal_divine_intervention::HandleRemove(), spell_pal_avenging_wrath::HandleRemove(), spell_rog_killing_spree_aura::HandleRemove(), spell_warr_vigilance::HandleRemove(), WorldSession::HandleRemoveGlyph(), spell_najentus_hurl_spine::HandleSchoolDamage(), spell_putricide_clear_aura_effect_value::HandleScript(), spell_the_lich_king_jump::HandleScript(), spell_the_lich_king_jump_remove_aura::HandleScript(), spell_icc_harvest_blight_specimen::HandleScript(), spell_festergut_pungent_blight::HandleScript(), spell_festergut_gastric_bloat::HandleScript(), spell_putricide_unbound_plague::HandleScript(), spell_putricide_eat_ooze::HandleScript(), spell_rotface_little_ooze_combine::HandleScript(), spell_rotface_large_ooze_combine::HandleScript(), spell_rotface_large_ooze_buff_combine::HandleScript(), spell_q10651_q10692_book_of_fel_names::HandleScript(), spell_q12641_death_comes_from_on_high_recall_eye::HandleScriptEffect(), spell_halion_clear_debuffs::HandleScriptEffect(), spell_q12823_remove_collapsing_cave_aura::HandleScriptEffect(), spell_illidari_council_judgement::HandleScriptEffect(), AuraEffect::HandleShapeshiftBoosts(), ArenaSpectator::HandleSpectatorWatchCommand(), AuraEffect::HandleSpiritOfRedemption(), spell_capacitus_polarity_charge::HandleTargets(), misc_commandscript::HandleUnAuraCommand(), misc_commandscript::HandleUnFreezeCommand(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::HealReceived(), npc_underbog_mushroom::InitializeAI(), npc_demon_chain::JustDied(), boss_azuregos::boss_azuregosAI::JustDied(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::JustDied(), boss_zuljin::JustEngagedWith(), boss_bronjahm::boss_bronjahmAI::JustEngagedWith(), boss_doomwalker::JustEngagedWith(), boss_gruul::JustEngagedWith(), boss_pathaleon_the_calculator::JustEngagedWith(), npc_pet_shaman_fire_elemental::JustEngagedWith(), boss_the_lich_king::boss_the_lich_kingAI::JustEngagedWith(), boss_jeklik::JustEngagedWith(), boss_buru::JustEngagedWith(), boss_gal_darah::boss_gal_darahAI::JustEngagedWith(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustEngagedWith(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustEngagedWith(), boss_prince_valanar_icc::boss_prince_valanarAI::JustEngagedWith(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::JustEngagedWith(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustEngagedWith(), boss_gurtogg_bloodboil::JustEngagedWith(), boss_hydross_the_unstable::JustReachedHome(), boss_felblood_kaelthas::LapseAction(), boss_garfrost::boss_garfrostAI::MovementInform(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::MovementInform(), boss_felmyst::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), npc_image_of_medivh::npc_image_of_medivhAI::NextStep(), spell_halion_twilight_realm_aura::OnApply(), spell_halion_leave_twilight_realm_aura::OnApply(), spell_systems_shutdown_aura::OnApply(), npc_chesspiece::OnCharmed(), npc_aged_dying_ancient_kodo::OnGossipHello(), spell_claw_rage_aura::OnPeriodic(), spell_yogg_saron_empowered_aura::OnPeriodic(), spell_gen_curse_of_pain::OnPeriodic(), spell_illidan_demon_transform2_aura::OnPeriodic(), BattlefieldWG::OnPlayerLeaveZone(), lfg::LFGPlayerScript::OnPlayerMapChanged(), MidsummerPlayerScript::OnPlayerUpdateZone(), boss_shade_of_aran::OnPowerUpdate(), spell_halion_combustion_consumption_aura::OnRemove(), spell_halion_leave_twilight_realm_aura::OnRemove(), spell_algalon_phase_punch_aura::OnRemove(), spell_load_into_catapult_aura::OnRemove(), spell_gen_damage_reduction_aura::OnRemove(), spell_hun_ascpect_of_the_viper::OnRemove(), spell_hun_viper_attack_speed::OnRemove(), spell_item_with_mount_speed::OnRemove(), spell_item_desperate_defense::OnRemove(), spell_item_shadowmourne::OnRemove(), spell_item_shadowmourne_soul_fragment::OnRemove(), spell_mage_combustion_proc::OnRemove(), spell_item_shadowmourne_soul_fragment::OnStackChange(), npc_wild_wyrm::npc_wild_wyrmAI::PassengerBoarded(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::PassengerBoarded(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::PassengerBoarded(), boss_jeklik::PathEndReached(), spell_quest_test_flight_charging::PerformKick(), SmartScript::ProcessAction(), ProcessTerrainStatusUpdate(), spell_gen_defend::RefreshVisualShields(), RemoveAurasDueToSpellByDispel(), BattlefieldWG::RemoveAurasFromPlayer(), boss_festergut::boss_festergutAI::RemoveBlight(), spell_warl_health_funnel::RemoveEffect(), RemoveGameObject(), BattlegroundAV::RemovePlayer(), Battleground::RemovePlayerFromResurrectQueue(), boss_keristrasza::RemovePrison(), Pet::removeSpell(), Player::removeSpell(), spell_gen_eject_all_passengers::RemoveVehicleAuras(), spell_gen_defend::RemoveVisualShields(), boss_malchezaar::Reset(), boss_baroness_anastari::boss_baroness_anastariAI::Reset(), boss_kiljaeden::Reset(), boss_twilight_corrupter::Reset(), boss_nalorakk::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_thekal::Reset(), boss_cthun::Reset(), boss_viscidus::Reset(), boss_halion::boss_halionAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_leotheras_the_blind::Reset(), boss_lethon::boss_lethonAI::Reset(), boss_taerar::boss_taerarAI::Reset(), boss_high_botanist_freywinn::ResumeEncounter(), Player::ResurrectPlayer(), npc_finklestein::npc_finklesteinAI::RightClickCauldron(), boss_magtheridon::ScheduleCombatEvents(), boss_supremus::SchedulePhase(), boss_laj::ScheduleTasks(), Player::SendQuestUpdate(), npc_corrupted_totem::SetAura(), OPvPCapturePointZM_Graveyard::SetBeaconState(), boss_hydross_the_unstable::SetForm(), Player::SetGMVisible(), boss_mandokir::boss_mandokirAI::SetGUID(), Player::SetIsSpectator(), SetModelVisible(), npc_akama_shade::sGossipSelect(), boss_viscidus::SoftReset(), boss_ossirian::SpellHit(), npc_omen::npc_omenAI::SpellHit(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_troll_volunteer::npc_troll_volunteerAI::SpellHit(), boss_sister_svalna::boss_sister_svalnaAI::SpellHit(), boss_faerlina::boss_faerlinaAI::SpellHit(), advisor_baseAI::SpellHit(), boss_moorabi::boss_moorabiAI::SpellHitTarget(), boss_festergut::boss_festergutAI::SpellHitTarget(), boss_ahune::Submerge(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_cthun::SummonedCreatureDies(), npc_kiljaeden_controller::SummonedCreatureDies(), boss_anzu::SummonedCreatureDies(), boss_viscidus::SummonedCreatureDies(), boss_terestian_illhoof::SummonKilrek(), Player::SummonPet(), boss_netherspite::SwitchToBanishPhase(), boss_netherspite::SwitchToPortalPhase(), Totem::UnSummon(), spell_black_temple_spell_absorption_aura::Update(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_renataki::boss_renatakiAI::UpdateAI(), boss_moam::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_draenei_survivor::npc_draenei_survivorAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_freya_lifebinder::boss_freya_lifebinderAI::UpdateAI(), boss_freya_healthy_spore::boss_freya_healthy_sporeAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_anzu::UpdateAI(), npc_pet_gen_soul_trader_beacon::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), npc_pet_darting_hatchling::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), and Player::UpdateTitansGrip().

◆ RemoveAurasDueToSpellByDispel()

void Unit::RemoveAurasDueToSpellByDispel ( uint32  spellId,
uint32  dispellerSpellId,
ObjectGuid  casterGUID,
Unit dispeller,
uint8  chargesRemoved = 1 
)
4999{
5000 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5001 for (AuraMap::iterator iter = range.first; iter != range.second;)
5002 {
5003 Aura* aura = iter->second;
5004 if (aura->GetCasterGUID() == casterGUID)
5005 {
5006 DispelInfo dispelInfo(dispeller, dispellerSpellId, chargesRemoved);
5007
5008 // Call OnDispel hook on AuraScript
5009 aura->CallScriptDispel(&dispelInfo);
5010
5012 aura->ModCharges(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5013 else
5014 aura->ModStackAmount(-dispelInfo.GetRemovedCharges(), AURA_REMOVE_BY_ENEMY_SPELL);
5015
5016 // Call AfterDispel hook on AuraScript
5017 aura->CallScriptAfterDispel(&dispelInfo);
5018
5019 switch (aura->GetSpellInfo()->SpellFamilyName)
5020 {
5021 case SPELLFAMILY_HUNTER:
5022 {
5023 // Noxious Stings
5024 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x1000)
5025 {
5026 if (Unit* caster = aura->GetCaster())
5027 {
5028 if (AuraEffect* aureff = caster->GetAuraEffect(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_HUNTER, 3521, 1))
5029 {
5030 if (Aura* noxious = Aura::TryCreate(aura->GetSpellInfo(), aura->GetEffectMask(), dispeller, caster))
5031 {
5032 noxious->SetDuration(aura->GetDuration() * aureff->GetAmount() / 100);
5033 if (aura->GetUnitOwner())
5034 if (const std::vector<int32>* spell_triggered = sSpellMgr->GetSpellLinked(-int32(aura->GetId())))
5035 for (std::vector<int32>::const_iterator itr = spell_triggered->begin(); itr != spell_triggered->end(); ++itr)
5036 aura->GetUnitOwner()->RemoveAurasDueToSpell(*itr);
5037 }
5038 }
5039 }
5040 }
5041 break;
5042 }
5044 {
5045 // Icy Clutch, remove with Frost Fever
5046 if (aura->GetSpellInfo()->SpellFamilyFlags[1] & 0x4000000)
5047 {
5048 if (AuraEffect* aureff = GetAuraEffect(SPELL_AURA_MOD_DECREASE_SPEED, SPELLFAMILY_DEATHKNIGHT, 0, 0x40000, 0, casterGUID))
5049 RemoveAurasDueToSpell(aureff->GetId());
5050 }
5051 }
5052 default:
5053 break;
5054 }
5055 return;
5056 }
5057 else
5058 ++iter;
5059 }
5060}
void CallScriptDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2390
static Aura * TryCreate(SpellInfo const *spellproto, uint8 effMask, WorldObject *owner, Unit *caster, int32 *baseAmount=nullptr, Item *castItem=nullptr, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemGUID=ObjectGuid::Empty)
Definition SpellAuras.cpp:352
bool ModCharges(int32 num, AuraRemoveMode removeMode=AURA_REMOVE_BY_DEFAULT)
Definition SpellAuras.cpp:973
void CallScriptAfterDispel(DispelInfo *dispelInfo)
Definition SpellAuras.cpp:2403
Definition Unit.h:297

References AURA_REMOVE_BY_ENEMY_SPELL, Aura::CallScriptAfterDispel(), Aura::CallScriptDispel(), GetAuraEffect(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetDuration(), Aura::GetEffectMask(), Aura::GetId(), DispelInfo::GetRemovedCharges(), Aura::GetSpellInfo(), Aura::GetUnitOwner(), SpellInfo::HasAttribute(), m_ownedAuras, Aura::ModCharges(), Aura::ModStackAmount(), RemoveAurasDueToSpell(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_HUNTER, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, sSpellMgr, and Aura::TryCreate().

Referenced by Spell::EffectDispel().

◆ RemoveAurasDueToSpellBySteal()

void Unit::RemoveAurasDueToSpellBySteal ( uint32  spellId,
ObjectGuid  casterGUID,
Unit stealer 
)
5063{
5064 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
5065 for (AuraMap::iterator iter = range.first; iter != range.second;)
5066 {
5067 Aura* aura = iter->second;
5068 if (aura->GetCasterGUID() == casterGUID)
5069 {
5070 int32 damage[MAX_SPELL_EFFECTS];
5071 int32 baseDamage[MAX_SPELL_EFFECTS];
5072 uint8 effMask = 0;
5073 uint8 recalculateMask = 0;
5074 Unit* caster = aura->GetCaster();
5075 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
5076 {
5077 if (aura->GetEffect(i))
5078 {
5079 baseDamage[i] = aura->GetEffect(i)->GetBaseAmount();
5080 damage[i] = aura->GetEffect(i)->GetAmount();
5081 effMask |= (1 << i);
5082 if (aura->GetEffect(i)->CanBeRecalculated())
5083 recalculateMask |= (1 << i);
5084 }
5085 else
5086 {
5087 baseDamage[i] = 0;
5088 damage[i] = 0;
5089 }
5090 }
5091
5093 // Cast duration to unsigned to prevent permanent aura's such as Righteous Fury being permanently added to caster
5094 uint32 dur = std::min(2u * MINUTE * IN_MILLISECONDS, uint32(aura->GetDuration()));
5095
5096 if (Aura* oldAura = stealer->GetAura(aura->GetId(), aura->GetCasterGUID()))
5097 {
5098 if (stealCharge)
5099 oldAura->ModCharges(1);
5100 else
5101 oldAura->ModStackAmount(1);
5102 oldAura->SetDuration(int32(dur));
5103 }
5104 else
5105 {
5106 // single target state must be removed before aura creation to preserve existing single target aura
5107 if (aura->IsSingleTarget())
5108 aura->UnregisterSingleTarget();
5109
5110 // Xinef: if stealer has same aura
5111 Aura* curAura = stealer->GetAura(aura->GetId());
5112 if (!curAura || (!curAura->IsPermanent() && curAura->GetDuration() < (int32)dur))
5113 if (Aura* newAura = Aura::TryRefreshStackOrCreate(aura->GetSpellInfo(), effMask, stealer, nullptr, &baseDamage[0], nullptr, aura->GetCasterGUID()))
5114 {
5115 // created aura must not be single target aura,, so stealer won't loose it on recast
5116 if (newAura->IsSingleTarget())
5117 {
5118 newAura->UnregisterSingleTarget();
5119 // bring back single target aura status to the old aura
5120 aura->SetIsSingleTarget(true);
5121 caster->GetSingleCastAuras().push_back(aura);
5122 }
5123 // FIXME: using aura->GetMaxDuration() maybe not blizzlike but it fixes stealing of spells like Innervate
5124 newAura->SetLoadedState(aura->GetMaxDuration(), int32(dur), stealCharge ? 1 : aura->GetCharges(), 1, recalculateMask, &damage[0]);
5125 newAura->ApplyForTargets();
5126 }
5127 }
5128
5129 if (stealCharge)
5131 else
5133
5134 return;
5135 }
5136 else
5137 ++iter;
5138 }
5139}
bool CanBeRecalculated() const
Definition SpellAuraEffects.h:78
int32 GetBaseAmount() const
Definition SpellAuraEffects.h:57
void UnregisterSingleTarget()
Definition SpellAuras.cpp:1167
bool IsPermanent() const
Definition SpellAuras.h:139

References AURA_REMOVE_BY_ENEMY_SPELL, AuraEffect::CanBeRecalculated(), AuraEffect::GetAmount(), GetAura(), AuraEffect::GetBaseAmount(), Aura::GetCaster(), Aura::GetCasterGUID(), Aura::GetCharges(), Aura::GetDuration(), Aura::GetEffect(), Aura::GetId(), Aura::GetMaxDuration(), GetSingleCastAuras(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), IN_MILLISECONDS, Aura::IsPermanent(), Aura::IsSingleTarget(), m_ownedAuras, MAX_SPELL_EFFECTS, MINUTE, Aura::ModCharges(), Aura::ModStackAmount(), Aura::SetIsSingleTarget(), SPELL_ATTR7_DISPEL_REMOVES_CHARGES, Aura::TryRefreshStackOrCreate(), and Aura::UnregisterSingleTarget().

Referenced by Spell::EffectStealBeneficialBuff().

◆ RemoveAurasWithAttribute()

void Unit::RemoveAurasWithAttribute ( uint32  flags)
5190{
5191 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5192 {
5193 SpellInfo const* spell = iter->second->GetBase()->GetSpellInfo();
5194 if (spell->Attributes & flags)
5195 RemoveAura(iter);
5196 else
5197 ++iter;
5198 }
5199}

References SpellInfo::Attributes, m_appliedAuras, and RemoveAura().

◆ RemoveAurasWithFamily()

void Unit::RemoveAurasWithFamily ( SpellFamilyNames  family,
uint32  familyFlag1,
uint32  familyFlag2,
uint32  familyFlag3,
ObjectGuid  casterGUID 
)
5273{
5274 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5275 {
5276 Aura const* aura = iter->second->GetBase();
5277 if (!casterGUID || aura->GetCasterGUID() == casterGUID)
5278 {
5279 SpellInfo const* spell = aura->GetSpellInfo();
5280 if (spell->SpellFamilyName == uint32(family) && spell->SpellFamilyFlags.HasFlag(familyFlag1, familyFlag2, familyFlag3))
5281 {
5282 RemoveAura(iter);
5283 continue;
5284 }
5285 }
5286 ++iter;
5287 }
5288}

References Aura::GetCasterGUID(), Aura::GetSpellInfo(), flag96::HasFlag(), m_appliedAuras, RemoveAura(), SpellInfo::SpellFamilyFlags, and SpellInfo::SpellFamilyName.

Referenced by spell_warl_demonic_aegis::HandleAuraApply(), and Aura::HandleAuraSpecificMods().

◆ RemoveAurasWithInterruptFlags()

void Unit::RemoveAurasWithInterruptFlags ( uint32  flag,
uint32  except = 0,
bool  isAutoshot = false 
)
5238{
5239 if (!(m_interruptMask & flag))
5240 return;
5241
5242 // interrupt auras
5243 for (AuraApplicationList::iterator iter = m_interruptableAuras.begin(); iter != m_interruptableAuras.end();)
5244 {
5245 Aura* aura = (*iter)->GetBase();
5246 ++iter;
5247 if ((aura->GetSpellInfo()->AuraInterruptFlags & flag) && (!except || aura->GetId() != except))
5248 {
5249 uint32 removedAuras = m_removedAurasCount;
5250 RemoveAura(aura);
5251 if (m_removedAurasCount > removedAuras + 1)
5252 iter = m_interruptableAuras.begin();
5253 }
5254 }
5255
5256 // interrupt channeled spell
5258 {
5259 if (spell->getState() == SPELL_STATE_CASTING && (spell->m_spellInfo->ChannelInterruptFlags & flag) && spell->m_spellInfo->Id != except)
5260 {
5261 // Do not interrupt if auto shot
5262 if (!(isAutoshot && spell->m_spellInfo->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS)))
5263 {
5264 InterruptNonMeleeSpells(false, spell->m_spellInfo->Id);
5265 }
5266 }
5267 }
5268
5270}

References SpellInfo::AuraInterruptFlags, CURRENT_CHANNELED_SPELL, Aura::GetId(), Aura::GetSpellInfo(), InterruptNonMeleeSpells(), m_currentSpells, m_interruptableAuras, m_interruptMask, m_removedAurasCount, RemoveAura(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_STATE_CASTING, and UpdateInterruptMask().

Referenced by _EnterVehicle(), AttackerStateUpdate(), ClearInPetCombat(), CombatStart(), CombatStartOnCast(), DealDamage(), Dismount(), Spell::DoAllEffectOnTarget(), Spell::DoSpellHitOnUnit(), BattlegroundWS::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerCapturedFlag(), BattlegroundEY::EventPlayerClickedOnFlag(), BattlegroundWS::EventPlayerClickedOnFlag(), BattlegroundAB::EventPlayerClickedOnFlag(), spell_rog_killing_spree::FilterTargets(), AuraEffect::HandleAuraModSchoolImmunity(), AuraEffect::HandleFeignDeath(), WorldSession::HandleGossipHelloOpcode(), AuraEffect::HandleModInvisibility(), AuraEffect::HandleModStealth(), AuraEffect::HandleModUnattackable(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandlePeriodicManaLeechAuraTick(), AuraEffect::HandlePhase(), Player::LoadFromDB(), WorldSession::LogoutPlayer(), Mount(), Spell::prepare(), ProcessTerrainStatusUpdate(), Player::SetInWater(), SetStandState(), Player::TeleportTo(), and UpdatePosition().

◆ RemoveAurasWithMechanic()

void Unit::RemoveAurasWithMechanic ( uint32  mechanic_mask,
AuraRemoveMode  removemode = AURA_REMOVE_BY_DEFAULT,
uint32  except = 0 
)
5310{
5311 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5312 {
5313 Aura const* aura = iter->second->GetBase();
5314 if (!except || aura->GetId() != except)
5315 {
5316 if (aura->GetSpellInfo()->GetAllEffectsMechanicMask() & mechanic_mask)
5317 {
5318 RemoveAura(iter, removemode);
5319 continue;
5320 }
5321 }
5322 ++iter;
5323 }
5324}

References SpellInfo::GetAllEffectsMechanicMask(), Aura::GetId(), Aura::GetSpellInfo(), m_appliedAuras, and RemoveAura().

Referenced by HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), AuraEffect::HandleModStateImmunityMask(), spell_rog_vanish_purge::HandleRootRemove(), spell_rog_vanish_purge::HandleSnareRemove(), and RemoveMovementImpairingAuras().

◆ RemoveBindSightAuras()

void Unit::RemoveBindSightAuras ( )
11276{
11278}
@ SPELL_AURA_BIND_SIGHT
Definition SpellAuraDefines.h:64

References RemoveAurasByType(), and SPELL_AURA_BIND_SIGHT.

Referenced by RemoveFromWorld().

◆ RemoveCharmAuras()

void Unit::RemoveCharmAuras ( )

◆ RemoveCharmedBy()

void Unit::RemoveCharmedBy ( Unit charmer)
18639{
18640 if (!IsCharmed())
18641 return;
18642
18643 if (!charmer)
18644 charmer = GetCharmer();
18645 if (charmer != GetCharmer()) // one aura overrides another?
18646 {
18647 // LOG_FATAL("entities.unit", "Unit::RemoveCharmedBy: this: {} true charmer: {} false charmer: {}",
18648 // GetGUID().ToString(), GetCharmerGUID().ToString(), charmer->GetGUID().ToString());
18649 // ABORT();
18650 return;
18651 }
18652
18653 CharmType type;
18655 type = CHARM_TYPE_POSSESS;
18656 else if (charmer && charmer->IsOnVehicle(this))
18657 type = CHARM_TYPE_VEHICLE;
18658 else
18659 type = CHARM_TYPE_CHARM;
18660
18661 if (_oldFactionId)
18662 {
18664 _oldFactionId = 0;
18665 }
18666 else
18668
18669 CastStop();
18670 AttackStop();
18671
18672 // xinef: update speed after charming
18673 UpdateSpeed(MOVE_RUN, false);
18674
18675 // xinef: do not break any controlled motion slot
18676 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == NULL_MOTION_TYPE)
18677 {
18678 StopMoving();
18680 }
18681 // xinef: if we have any controlled movement, clear active and idle only
18682 else
18684
18686
18687 // xinef: remove stunned flag if owner was mounted
18690
18691 // If charmer still exists
18692 if (!charmer)
18693 return;
18694
18695 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18696 ASSERT(type != CHARM_TYPE_VEHICLE || (IsCreature() && IsVehicle()));
18697
18698 charmer->SetCharm(this, false);
18699
18701
18702 Player* playerCharmer = charmer->ToPlayer();
18703 if (playerCharmer)
18704 {
18705 switch (type)
18706 {
18707 case CHARM_TYPE_VEHICLE:
18708 playerCharmer->SetClientControl(this, false);
18709 playerCharmer->SetClientControl(charmer, true); // verified
18712 break;
18713 case CHARM_TYPE_POSSESS:
18714 playerCharmer->SetClientControl(this, false);
18715 playerCharmer->SetClientControl(charmer, true); // verified
18720 break;
18721 case CHARM_TYPE_CHARM:
18723 {
18725 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18726 {
18728 if (GetCharmInfo())
18729 GetCharmInfo()->SetPetNumber(0, true);
18730 else
18731 LOG_ERROR("entities.unit", "Aura::HandleModCharm: target={} has a charm aura but no charm info!", GetGUID().ToString());
18732 }
18733 }
18734 break;
18735 default:
18736 break;
18737 }
18738 }
18739
18740 if (Player* player = ToPlayer())
18741 {
18742 sScriptMgr->AnticheatSetUnderACKmount(player);
18743 }
18744
18745 // xinef: restore threat
18746 for (CharmThreatMap::const_iterator itr = _charmThreatInfo.begin(); itr != _charmThreatInfo.end(); ++itr)
18747 {
18748 if (Unit* target = ObjectAccessor::GetUnit(*this, itr->first))
18749 if (!IsFriendlyTo(target))
18750 AddThreat(target, itr->second);
18751 }
18752
18753 _charmThreatInfo.clear();
18754
18755 if (Creature* creature = ToCreature())
18756 {
18757 // Vehicle should not attack its passenger after he exists the seat
18758 if (type != CHARM_TYPE_VEHICLE && charmer->IsAlive() && !charmer->IsFriendlyTo(creature))
18759 if (Attack(charmer, true))
18760 GetMotionMaster()->MoveChase(charmer);
18761
18762 // Creature will restore its old AI on next update
18763 if (creature->AI())
18764 creature->AI()->OnCharmed(false);
18765
18766 // Xinef: Remove movement flag flying
18768 }
18769 else
18770 ToPlayer()->SetClientControl(this, true); // verified
18771
18772 // a guardian should always have charminfo
18773 if (playerCharmer && this != charmer->GetFirstControlled())
18774 playerCharmer->SendRemoveControlBar();
18775
18776 // xinef: Always delete charm info (restores react state)
18777 if (IsPlayer() || (IsCreature() && !ToCreature()->IsGuardian()))
18779}
CharmType
Definition CharmInfo.h:44
@ CHARM_TYPE_CHARM
Definition CharmInfo.h:45
@ CHARM_TYPE_POSSESS
Definition CharmInfo.h:46
@ CHARM_TYPE_VEHICLE
Definition CharmInfo.h:47
@ MOTION_SLOT_CONTROLLED
Definition MotionMaster.h:65
@ MOTION_SLOT_ACTIVE
Definition MotionMaster.h:64
@ NULL_MOTION_TYPE
Definition MotionMaster.h:58
@ CREATURE_TYPE_DEMON
Definition SharedDefines.h:2630
@ CLASS_CONTEXT_PET_CHARM
Definition UnitDefines.h:237
@ UNIT_STATE_NO_ENVIRONMENT_UPD
Definition UnitDefines.h:198
@ MOVE_RUN
Definition UnitDefines.h:350
@ UNIT_FLAG_DISABLE_MOVE
Definition UnitDefines.h:252
void InitDefault()
Definition MotionMaster.cpp:87
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:194
void MovementExpired(bool reset=true)
Definition MotionMaster.h:180
void SetByteValue(uint16 index, uint8 offset, uint8 value)
Definition Object.cpp:750
void SendRemoveControlBar()
Definition Player.cpp:9728
void SetClientControl(Unit *target, bool allowMove, bool packetOnly=false)
Definition Player.cpp:12829
void DeleteCharmInfo()
Definition Unit.cpp:15895
void RestoreFaction()
Definition Unit.cpp:18781
void SetCharm(Unit *target, bool apply)
Definition Unit.cpp:10962
void StopAttackingInvalidTarget()
Definition Unit.cpp:20022
void CastStop(uint32 except_spellid=0, bool withInstant=true)
Interrupt the unit cast for all the current spells.
Definition Unit.cpp:1186
bool Attack(Unit *victim, bool meleeAttack)
Definition Unit.cpp:10333
CharmThreatMap _charmThreatInfo
Definition Unit.h:2109
void RemoveUnitMovementFlag(uint32 f)
Definition Unit.h:728
void UpdateSpeed(UnitMoveType mtype, bool forced)
Definition Unit.cpp:14340
uint32 unit_class
Definition CreatureData.h:213

References _charmThreatInfo, _oldFactionId, AddThreat(), ASSERT, Attack(), AttackStop(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, CLASS_CONTEXT_PET_CHARM, CLASS_WARLOCK, ClearUnitState(), CREATURE_TYPE_DEMON, DeleteCharmInfo(), GetCharmer(), GetCharmInfo(), Creature::GetCreatureTemplate(), GetFirstControlled(), Object::GetGUID(), GetMotionMaster(), ObjectAccessor::GetUnit(), HasUnitState(), MotionMaster::InitDefault(), IsAlive(), IsCharmed(), IsClass(), Object::IsCreature(), IsFriendlyTo(), IsGuardian(), IsOnVehicle(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MOTION_SLOT_ACTIVE, MOTION_SLOT_CONTROLLED, MOVE_RUN, MotionMaster::MoveChase(), MotionMaster::MovementExpired(), MotionMaster::MovementExpiredOnSlot(), MOVEMENTFLAG_FLYING, NULL_MOTION_TYPE, RemoveUnitFlag(), RemoveUnitMovementFlag(), RestoreFaction(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), sScriptMgr, StopAttackingInvalidTarget(), StopMoving(), Object::ToCreature(), Object::ToPlayer(), Position::ToString(), CreatureTemplate::type, CreatureTemplate::unit_class, UNIT_FIELD_BYTES_0, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_FLAG_STUNNED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, UNIT_STATE_STUNNED, and UpdateSpeed().

Referenced by AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), npc_chesspiece::JustDied(), Puppet::RemoveFromWorld(), Vehicle::RemovePassenger(), and npc_chesspiece::sGossipSelect().

◆ RemoveComboPointHolder()

void Unit::RemoveComboPointHolder ( Unit unit)
inline
963{ m_ComboPointHolders.erase(unit); }

References m_ComboPointHolders.

Referenced by AddComboPoints(), and ClearComboPoints().

◆ RemoveDynObject()

bool Unit::RemoveDynObject ( uint32  spellId)
6229{
6230 if (m_dynObj.empty())
6231 return false;
6232
6233 bool result = false;
6234 for (DynObjectList::iterator i = m_dynObj.begin(); i != m_dynObj.end();)
6235 {
6236 DynamicObject* dynObj = *i;
6237 if (dynObj->GetSpellId() == spellId)
6238 {
6239 dynObj->Remove();
6240 i = m_dynObj.begin();
6241 result = true;
6242 }
6243 else
6244 ++i;
6245 }
6246
6247 return result;
6248}
void Remove()
Definition DynamicObject.cpp:185

References DynamicObject::GetSpellId(), m_dynObj, and DynamicObject::Remove().

Referenced by Spell::cancel(), Spell::EffectAddFarsight(), and spell_item_shifting_naaru_silver::OnBaseRemove().

◆ RemoveEvadeAuras()

void Unit::RemoveEvadeAuras ( )
5494{
5495 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5496 {
5497 Aura const* aura = iter->second->GetBase();
5498 SpellInfo const* spellInfo = aura->GetSpellInfo();
5500 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5501 ++iter;
5502 else
5504 }
5505
5506 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5507 {
5508 Aura* aura = iter->second;
5509 SpellInfo const* spellInfo = aura->GetSpellInfo();
5511 || spellInfo->HasAura(SPELL_AURA_CLONE_CASTER) || (aura->IsPassive() && GetOwnerGUID().IsPlayer()))
5512 ++iter;
5513 else
5515 }
5516}
@ SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT
Definition SharedDefines.h:444
@ SPELL_ATTR0_CU_IGNORE_EVADE
Definition SpellInfo.h:187

References _UnapplyAura(), AURA_REMOVE_BY_DEFAULT, GetOwnerGUID(), Aura::GetSpellInfo(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), Aura::IsPassive(), ObjectGuid::IsPlayer(), m_appliedAuras, m_ownedAuras, RemoveOwnedAura(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CLONE_CASTER, and SPELL_AURA_CONTROL_VEHICLE.

Referenced by CreatureAI::_EnterEvadeMode(), and npc_pos_freed_slave::npc_pos_freed_slaveAI::EnterEvadeMode().

◆ RemoveExtraUnitMovementFlag()

void Unit::RemoveExtraUnitMovementFlag ( uint16  f)
inline

◆ removeFollower()

void Unit::removeFollower ( FollowerReference )
inline
1808{ /* nothing to do yet */ }

Referenced by FollowerReference::targetObjectDestroyLink().

◆ RemoveFromWorld()

void Unit::RemoveFromWorld ( )
overridevirtual

Reimplemented from Object.

15773{
15774 // cleanup
15775 ASSERT(GetGUID());
15776
15777 if (IsInWorld())
15778 {
15780 if (IsVehicle())
15782
15786
15789
15790 ExitVehicle(); // Remove applied auras with SPELL_AURA_CONTROL_VEHICLE
15793
15795
15796 if (GetCharmerGUID())
15797 {
15798 LOG_FATAL("entities.unit", "Unit {} has charmer guid when removed from world", GetEntry());
15799 ABORT();
15800 }
15801
15802 if (Unit* owner = GetOwner())
15803 {
15804 if (owner->m_Controlled.find(this) != owner->m_Controlled.end())
15805 {
15807 owner->SetMinion((Minion*)this, false);
15808 LOG_INFO("entities.unit", "Unit {} is in controlled list of {} when removed from world", GetEntry(), owner->GetEntry());
15809 //ABORT();
15810 }
15811 }
15812
15815 }
15816}
void RemoveNotOwnSingleTargetAuras()
Definition Unit.cpp:5201
void UnsummonAllTotems(bool onDeath=false)
Definition Unit.cpp:11288
void RemoveAllDynObjects()
Definition Unit.cpp:6250
void RemoveAreaAurasDueToLeaveWorld()
Definition Unit.cpp:5342
void RemoveBindSightAuras()
Definition Unit.cpp:11275
void RemoveAllControlled(bool onDeath=false)
Definition Unit.cpp:11172
void RemoveFromWorld() override
Definition Object.cpp:1175

References ABORT, ASSERT, ExitVehicle(), GetCharmerGUID(), Object::GetEntry(), Object::GetGUID(), GetOwner(), HasUnitTypeMask(), Object::IsInWorld(), IsVehicle(), LOG_FATAL, LOG_INFO, m_duringRemoveFromWorld, RemoveAllControlled(), RemoveAllDynObjects(), RemoveAllGameObjects(), RemoveAreaAurasDueToLeaveWorld(), RemoveBindSightAuras(), RemoveCharmAuras(), WorldObject::RemoveFromWorld(), RemoveNotOwnSingleTargetAuras(), RemoveVehicleKit(), UNIT_MASK_GUARDIAN, UNIT_MASK_MINION, and UnsummonAllTotems().

Referenced by CleanupBeforeRemoveFromMap(), Creature::RemoveFromWorld(), Pet::RemoveFromWorld(), and Player::RemoveFromWorld().

◆ RemoveGameObject() [1/2]

void Unit::RemoveGameObject ( GameObject gameObj,
bool  del 
)
6285{
6286 if (!gameObj || gameObj->GetOwnerGUID() != GetGUID())
6287 return;
6288
6290
6291 for (uint8 i = 0; i < MAX_GAMEOBJECT_SLOT; ++i)
6292 {
6293 if (m_ObjectSlot[i] == gameObj->GetGUID())
6294 {
6295 m_ObjectSlot[i].Clear();
6296 break;
6297 }
6298 }
6299
6300 // GO created by some spell
6301 if (uint32 spellid = gameObj->GetSpellId())
6302 {
6303 RemoveAurasDueToSpell(spellid);
6304
6305 if (IsPlayer())
6306 {
6307 SpellInfo const* createBySpell = sSpellMgr->GetSpellInfo(spellid);
6308 // Need activate spell use for owner
6309 if (createBySpell && createBySpell->IsCooldownStartedOnEvent())
6310 // note: item based cooldowns and cooldown spell mods with charges ignored (unknown existing cases)
6311 ToPlayer()->SendCooldownEvent(createBySpell);
6312 }
6313 }
6314
6315 m_gameObj.remove(gameObj->GetGUID());
6316
6317 if (del)
6318 {
6319 gameObj->SetRespawnTime(0);
6320 gameObj->Delete();
6321 }
6322}
void Clear()
Definition ObjectGuid.h:138
void SendCooldownEvent(SpellInfo const *spellInfo, uint32 itemId=0, Spell *spell=nullptr, bool setCooldown=true)
Definition Player.cpp:11085

References ObjectGuid::Clear(), GameObject::Delete(), ObjectGuid::Empty, Object::GetGUID(), Object::GetGUID(), GameObject::GetOwnerGUID(), GameObject::GetSpellId(), SpellInfo::IsCooldownStartedOnEvent(), Object::IsPlayer(), m_gameObj, m_ObjectSlot, MAX_GAMEOBJECT_SLOT, RemoveAurasDueToSpell(), Player::SendCooldownEvent(), GameObject::SetOwnerGUID(), GameObject::SetRespawnTime(), sSpellMgr, and Object::ToPlayer().

Referenced by Spell::cancel(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), Spell::EffectSummonObject(), gobject_commandscript::HandleGameObjectDeleteCommand(), spell_warl_demonic_circle_summon::HandleRemove(), boss_kologarn::boss_kologarnAI::JustDied(), npc_ulduar_harpoonfirestate::npc_ulduar_harpoonfirestateAI::SetData(), GameObject::Update(), and npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI().

◆ RemoveGameObject() [2/2]

void Unit::RemoveGameObject ( uint32  spellid,
bool  del 
)
6325{
6326 if (m_gameObj.empty())
6327 return;
6328
6329 for (GameObjectList::iterator itr = m_gameObj.begin(); itr != m_gameObj.end();)
6330 {
6331 if (GameObject* go = ObjectAccessor::GetGameObject(*this, *itr))
6332 {
6333 if (spellid > 0 && go->GetSpellId() != spellid)
6334 {
6335 ++itr;
6336 continue;
6337 }
6338
6339 go->SetOwnerGUID(ObjectGuid::Empty);
6340 if (del)
6341 {
6342 go->SetRespawnTime(0);
6343 go->Delete();
6344 }
6345 }
6346 m_gameObj.erase(itr++);
6347 }
6348}

References ObjectGuid::Empty, ObjectAccessor::GetGameObject(), and m_gameObj.

◆ removeHatedBy()

void Unit::removeHatedBy ( HostileReference )
inline
901{ /* nothing to do yet */ }

Referenced by HostileReference::targetObjectDestroyLink().

◆ RemoveMovementImpairingAuras()

void Unit::RemoveMovementImpairingAuras ( bool  withRoot)
5291{
5292 if (withRoot)
5294
5295 // Snares
5296 for (AuraApplicationMap::iterator iter = m_appliedAuras.begin(); iter != m_appliedAuras.end();)
5297 {
5298 Aura const* aura = iter->second->GetBase();
5300 {
5301 RemoveAura(iter);
5302 continue;
5303 }
5304
5305 ++iter;
5306 }
5307}
bool HasEffectMechanic(Mechanics mechanic) const
Definition SpellInfo.cpp:884

References Aura::GetSpellInfo(), SpellInfo::HasEffectMechanic(), m_appliedAuras, SpellInfo::Mechanic, MECHANIC_ROOT, MECHANIC_SNARE, RemoveAura(), and RemoveAurasWithMechanic().

Referenced by Spell::CheckCast(), Spell::EffectTriggerSpell(), HandleDummyAuraProc(), AuraEffect::HandleModMechanicImmunity(), and spell_gen_remove_impairing_auras::HandleScriptEffect().

◆ RemoveNotOwnSingleTargetAuras()

void Unit::RemoveNotOwnSingleTargetAuras ( )
5202{
5203 // single target auras from other casters
5204 // Iterate m_ownedAuras - aura is marked as single target in Unit::AddAura (and pushed to m_ownedAuras).
5205 // m_appliedAuras will NOT contain the aura before first Unit::Update after adding it to m_ownedAuras.
5206 // Quickly removing such an aura will lead to it not being unregistered from caster's single cast auras container
5207 // leading to assertion failures if the aura was cast on a player that can
5208 // (and is changing map at the point where this function is called).
5209 // Such situation occurs when player is logging in inside an instance and fails the entry check for any reason.
5210 // The aura that was loaded from db (indirectly, via linked casts) gets removed before it has a chance
5211 // to register in m_appliedAuras
5212 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
5213 {
5214 Aura const* aura = iter->second;
5215
5216 if (aura->GetCasterGUID() != GetGUID() && aura->IsSingleTarget())
5217 RemoveOwnedAura(iter);
5218 else
5219 ++iter;
5220 }
5221
5222 // single target auras at other targets
5223 AuraList& scAuras = GetSingleCastAuras();
5224 for (AuraList::iterator iter = scAuras.begin(); iter != scAuras.end();)
5225 {
5226 Aura* aura = *iter;
5227 if (aura->GetUnitOwner() != this)
5228 {
5229 aura->Remove();
5230 iter = scAuras.begin();
5231 }
5232 else
5233 ++iter;
5234 }
5235}

References Aura::GetCasterGUID(), Object::GetGUID(), GetSingleCastAuras(), Aura::GetUnitOwner(), Aura::IsSingleTarget(), m_ownedAuras, Aura::Remove(), and RemoveOwnedAura().

Referenced by RemoveFromWorld().

◆ RemoveNpcFlag()

void Unit::RemoveNpcFlag ( NPCFlags  flags)
inline
720{ RemoveFlag(UNIT_NPC_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), boss_vaelastrasz::boss_vaelAI::BeginSpeech(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_fos_leader::npc_fos_leaderAI::DoAction(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_akama_illidan::DoAction(), spell_q12096_q12092_dummy::HandleDummy(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), npc_precious::npc_preciousAI::JustEngagedWith(), npc_artorius::npc_artoriusAI::JustEngagedWith(), npc_simone::npc_simoneAI::JustEngagedWith(), npc_nelson::npc_nelsonAI::JustEngagedWith(), npc_franklin::npc_franklinAI::JustEngagedWith(), npc_akama_illidan::JustReachedHome(), npc_fos_leader_second::npc_fos_leader_secondAI::npc_fos_leader_secondAI(), npc_pos_leader_second::npc_pos_leader_secondAI::npc_pos_leader_secondAI(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_serpent_shrine::instance_serpentshrine_cavern_InstanceMapScript::OnCreatureCreate(), npc_announcer_toc10::OnGossipHello(), npc_hyjal_jaina::OnGossipSelect(), npc_hyjal_thrall::OnGossipSelect(), boss_doomrel::OnGossipSelect(), boss_majordomo::OnGossipSelect(), npc_zulaman_hostage::OnGossipSelect(), npc_arthas::OnGossipSelect(), npc_ulduar_keeper::OnGossipSelect(), npc_announcer_toc5::OnGossipSelect(), npc_announcer_toc10::OnGossipSelect(), npc_hor_leader::OnGossipSelect(), npc_ulduar_expedition_commander::OnGossipSelect(), npc_thrall_old_hillsbrad::OnGossipSelect(), npc_hor_leader_second::OnGossipSelect(), npc_battle_at_valhalas::OnQuestAccept(), npc_riggle_bassbait::OnQuestReward(), NPCStaveQuestAI::PrepareForEncounter(), RemoveVehicleKit(), boss_majordomo::boss_majordomoAI::Reset(), npc_arthas::npc_arthasAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), npc_xerestrasza::npc_xerestraszaAI::Reset(), npc_tirion_fordring_tft::npc_tirion_fordringAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_lake_frog::npc_lake_frogAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_magister_aledis::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), instance_violet_hold::instance_violet_hold_InstanceMapScript::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::sGossipSelect(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::sGossipSelect(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::sGossipSelect(), boss_apothecary_hummel::boss_apothecary_hummelAI::sGossipSelect(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::sGossipSelect(), npc_thassarian2::npc_thassarian2AI::sGossipSelect(), npc_general_andorov::sGossipSelect(), npc_akama_shade::sGossipSelect(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_chesspiece::SpellHitTarget(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_deathstalker_fearleia::sQuestAccept(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), npc_magister_aledis::StartFight(), npc_cork_gizelton::npc_cork_gizeltonAI::SummonHelpers(), npc_plucky::npc_pluckyAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), and Vehicle::Vehicle().

◆ RemoveOwnedAura() [1/3]

void Unit::RemoveOwnedAura ( Aura aura,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4795{
4796 if (aura->IsRemoved())
4797 return;
4798
4799 ASSERT(aura->GetOwner() == this);
4800
4801 uint32 spellId = aura->GetId();
4802 AuraMapBoundsNonConst range = m_ownedAuras.equal_range(spellId);
4803
4804 for (AuraMap::iterator itr = range.first; itr != range.second; ++itr)
4805 {
4806 if (itr->second == aura)
4807 {
4808 RemoveOwnedAura(itr, removeMode);
4809 return;
4810 }
4811 }
4812
4813 ABORT();
4814}

References ABORT, ASSERT, Aura::GetId(), Aura::GetOwner(), Aura::IsRemoved(), m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAura() [2/3]

void Unit::RemoveOwnedAura ( AuraMap::iterator &  i,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4762{
4763 Aura* aura = i->second;
4764 ASSERT(!aura->IsRemoved());
4765
4766 // if unit currently update aura list then make safe update iterator shift to next
4769
4770 m_ownedAuras.erase(i);
4771 m_removedAuras.push_back(aura);
4772
4773 // Unregister single target aura
4774 if (aura->IsSingleTarget())
4775 aura->UnregisterSingleTarget();
4776
4777 aura->_Remove(removeMode);
4778
4779 i = m_ownedAuras.begin();
4780}
void _Remove(AuraRemoveMode removeMode)
Definition SpellAuras.cpp:574

References Aura::_Remove(), ASSERT, Aura::IsRemoved(), Aura::IsSingleTarget(), m_auraUpdateIterator, m_ownedAuras, m_removedAuras, and Aura::UnregisterSingleTarget().

Referenced by Player::_removeTalentAurasAndSpells(), _UpdateSpells(), Player::ActivateSpec(), Spell::EffectApplyGlyph(), WorldSession::HandleCancelAuraOpcode(), WorldSession::HandlePetCancelAuraOpcode(), WorldSession::HandleRemoveGlyph(), AuraEffect::HandleShapeshiftBoosts(), boss_zuljin::JustEngagedWith(), spell_gen_animal_blood::OnApply(), spell_contagion_of_rot::OnApply(), UnitAura::Remove(), RemoveAllAuras(), RemoveAllAurasExceptType(), RemoveAllAurasOnDeath(), RemoveAllAurasRequiringDeadTarget(), RemoveAurasDueToItemSpell(), RemoveEvadeAuras(), Player::RemoveItemDependentAurasAndCasts(), RemoveNotOwnSingleTargetAuras(), RemoveOwnedAura(), RemoveOwnedAura(), RemoveOwnedAuras(), RemoveOwnedAuras(), Player::removeSpell(), boss_falric::boss_falricAI::UpdateAI(), and Player::UpdateAreaDependentAuras().

◆ RemoveOwnedAura() [3/3]

void Unit::RemoveOwnedAura ( uint32  spellId,
ObjectGuid  casterGUID = ObjectGuid::Empty,
uint8  reqEffMask = 0,
AuraRemoveMode  removeMode = AURA_REMOVE_BY_DEFAULT 
)
4783{
4784 for (AuraMap::iterator itr = m_ownedAuras.lower_bound(spellId); itr != m_ownedAuras.upper_bound(spellId);)
4785 if (((itr->second->GetEffectMask() & reqEffMask) == reqEffMask) && (!casterGUID || itr->second->GetCasterGUID() == casterGUID))
4786 {
4787 RemoveOwnedAura(itr, removeMode);
4788 itr = m_ownedAuras.lower_bound(spellId);
4789 }
4790 else
4791 ++itr;
4792}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [1/2]

void Unit::RemoveOwnedAuras ( std::function< bool(Aura const *)> const &  check)
4914{
4915 for (AuraMap::iterator iter = m_ownedAuras.begin(); iter != m_ownedAuras.end();)
4916 {
4917 if (check(iter->second))
4918 {
4919 RemoveOwnedAura(iter);
4920 continue;
4921 }
4922 ++iter;
4923 }
4924}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemoveOwnedAuras() [2/2]

void Unit::RemoveOwnedAuras ( uint32  spellId,
std::function< bool(Aura const *)> const &  check 
)
4940{
4941 for (AuraMap::iterator iter = m_ownedAuras.lower_bound(spellId); iter != m_ownedAuras.upper_bound(spellId);)
4942 {
4943 if (check(iter->second))
4944 {
4945 RemoveOwnedAura(iter);
4946 continue;
4947 }
4948 ++iter;
4949 }
4950}

References m_ownedAuras, and RemoveOwnedAura().

◆ RemovePetAura()

void Unit::RemovePetAura ( PetAura const *  petSpell)
17382{
17383 if (!IsPlayer())
17384 return;
17385
17386 m_petAuras.erase(petSpell);
17387 if (Pet* pet = ToPlayer()->GetPet())
17388 pet->RemoveAurasDueToSpell(petSpell->GetAura(pet->GetEntry()));
17389 if (Unit* charm = GetCharm())
17390 charm->RemoveAurasDueToSpell(petSpell->GetAura(charm->GetEntry()));
17391}

References PetAura::GetAura(), GetCharm(), Object::IsPlayer(), m_petAuras, and Object::ToPlayer().

Referenced by Player::_removeTalentAurasAndSpells(), Pet::CastPetAuras(), AuraEffect::HandleAuraDummy(), and Player::removeSpell().

◆ RemovePlayerFromVision()

void Unit::RemovePlayerFromVision ( Player player)
Todo:
: This isn't right, if a previously active object was set to active with e.g. Mind Vision this will make them no longer active
11266{
11267 m_sharedVision.remove(player);
11268 player->m_isInSharedVisionOf.erase(this);
11269
11271 if (m_sharedVision.empty())
11272 setActive(false);
11273}

References Player::m_isInSharedVisionOf, m_sharedVision, and WorldObject::setActive().

Referenced by Player::SetViewpoint(), and Player::~Player().

◆ RemovePointedBy()

void Unit::RemovePointedBy ( SafeUnitPointer sup)
inline

◆ RemoveStandFlags()

void Unit::RemoveStandFlags ( uint8  flags)
inline
@ UNIT_BYTES_1_OFFSET_VIS_FLAG
Definition UnitDefines.h:25
void RemoveByteFlag(uint16 index, uint8 offset, uint8 newFlag)
Definition Object.cpp:930

References Object::RemoveByteFlag(), UNIT_BYTES_1_OFFSET_VIS_FLAG, and UNIT_FIELD_BYTES_1.

Referenced by AuraEffect::HandleModStealth(), Player::InitStatsForLevel(), and npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI().

◆ RemoveUnitFlag()

void Unit::RemoveUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

704{ RemoveFlag(UNIT_FIELD_FLAGS, flags); }

References Object::RemoveFlag(), and UNIT_FIELD_FLAGS.

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), Player::BuildPlayerRepop(), boss_thekal::CheckPhaseTransition(), Player::CleanupAfterTaxiFlight(), ClearInCombat(), ClearInPetCombat(), boss_alar::DamageTaken(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), Dismount(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_thekal::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_the_lurker_below::DoAction(), npc_frozen_core::DoAction(), boss_broggok::DoAction(), instance_karazhan::instance_karazhan_InstanceMapScript::DoAction(), boss_cthun::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_tyrannus::boss_tyrannusAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), npc_massive_jormungar::npc_massive_jormungarAI::DoAction(), npc_ferocious_rhino::npc_ferocious_rhinoAI::DoAction(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::DoAction(), npc_frenzied_worgen::npc_frenzied_worgenAI::DoAction(), boss_illidan_stormrage::DoAction(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DoAction(), boss_essence_of_desire::boss_essence_of_desireAI::DoAction(), boss_essence_of_anger::boss_essence_of_angerAI::DoAction(), boss_kelidan_the_breaker::DoAction(), boss_ichoron::boss_ichoronAI::DoExplodeCompleted(), HomeMovementGenerator< Creature >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), WorldSession::DoLootRelease(), Spell::EffectResurrectPet(), Spell::EffectSkinning(), npc_giant_claw_tentacle::Emerge(), boss_ahune::Emerge(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_bronjahm::boss_bronjahmAI::EnterEvadeMode(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), boss_kelthuzad::boss_kelthuzadAI::EnterEvadeMode(), boss_malygos::boss_malygosAI::EnterEvadeMode(), boss_ymiron::boss_ymironAI::EnterEvadeMode(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), npc_future_you::npc_future_youAI::EnterEvadeMode(), SACActivateEvent::Execute(), boss_ingvar_the_plunderer::FeignDeath(), TimedFleeingMovementGenerator::Finalize(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_feign_death_all_flags::HandleEffectRemove(), spell_gen_feign_death_no_dyn_flag::HandleEffectRemove(), spell_gen_feign_death_no_prevent_emotes::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), AuraEffect::HandleFeignDeath(), WorldSession::HandleLogoutCancelOpcode(), spell_oculus_drake_flag_aura::HandleOnEffectApply(), spell_oculus_rider_aura::HandleOnEffectRemove(), WorldSession::HandlePlayerLoginToCharInWorld(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_kiljaeden::InitializeAI(), boss_jarien::IsSummonedBy(), boss_sothos::IsSummonedBy(), boss_apothecary_hummel::boss_apothecary_hummelAI::JustDied(), boss_volazj::JustDied(), boss_ichoron::boss_ichoronAI::JustDied(), boss_taerar::boss_taerarAI::JustDied(), boss_noth::boss_nothAI::JustDied(), boss_ymiron::boss_ymironAI::JustEngagedWith(), boss_hazzarah::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), boss_shade_of_akama::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), npc_death_knight_initiate::OnGossipSelect(), npc_bessy::OnQuestAccept(), spell_halion_twilight_phasing_aura::OnRemove(), boss_nightbane::PathEndReached(), boss_nefarian::PathEndReached(), RemoveCharmedBy(), Vehicle::RemovePassenger(), boss_keristrasza::RemovePrison(), boss_lord_valthalak::boss_lord_valthalakAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_crone::Reset(), boss_julianne::Reset(), boss_kalecgos::Reset(), boss_kiljaeden::Reset(), boss_muru::Reset(), npc_harrison_jones::Reset(), npc_amanishi_lookout::Reset(), boss_eye_of_cthun::Reset(), boss_volazj::Reset(), boss_anub_arak::boss_anub_arakAI::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_bronjahm::boss_bronjahmAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_kelthuzad::boss_kelthuzadAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_crystalline_frayer::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), boss_mimiron::boss_mimironAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_svala::boss_svalaAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), boss_ichoron::boss_ichoronAI::Reset(), npc_wounded_skirmisher::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_leotheras_the_blind::Reset(), npc_shattered_hand_scout::Reset(), boss_kaelthas::Reset(), advisor_baseAI::Reset(), emerald_dragonAI::Reset(), npc_doctor::npc_doctorAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Resurrect(), boss_magtheridon::ScheduleCombatEvents(), boss_the_lurker_below::SchedulerPhaseTwo(), SetCharm(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SetData(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SetData(), Pet::setDeathState(), SetImmuneToNPC(), SetImmuneToPC(), Player::SetIsSpectator(), SetStunned(), SetSwim(), Battlefield::ShowNpc(), npc_black_knight_ghoul::npc_black_knight_ghoulAI::SpellHit(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::SpellHit(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::SpellHit(), npc_ulduar_vx001::npc_ulduar_vx001AI::SpellHit(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::SpellHit(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), advisor_baseAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_headless_horseman_head::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), instance_violet_hold::instance_violet_hold_InstanceMapScript::StartBossEncounter(), boss_lord_valthalak::boss_lord_valthalakAI::StartFighting(), boss_noth::boss_nothAI::StartGroundPhase(), boss_drakkari_colossus::boss_drakkari_colossusAI::SummonedCreatureDespawn(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_volazj::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_novos::boss_novosAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_kelthuzad::boss_kelthuzadAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_crystalline_frayer::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), npc_hol_monument::npc_hol_monumentAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_q24545_vegard::npc_q24545_vegardAI::UpdateAI(), boss_taerar::boss_taerarAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), and npc_general_andorov::WaypointReached().

◆ RemoveUnitFlag2()

◆ RemoveUnitMovementFlag()

◆ RemoveVehicleKit()

void Unit::RemoveVehicleKit ( )
18814{
18815 if (!m_vehicleKit)
18816 return;
18817
18819 delete m_vehicleKit;
18820
18821 m_vehicleKit = nullptr;
18822
18823 m_updateFlag &= ~UPDATEFLAG_VEHICLE;
18824 m_unitTypeMask &= ~UNIT_MASK_VEHICLE;
18826}
@ UNIT_NPC_FLAG_SPELLCLICK
Definition UnitDefines.h:339
@ UNIT_NPC_FLAG_PLAYER_VEHICLE
Definition UnitDefines.h:340
void RemoveNpcFlag(NPCFlags flags)
Definition Unit.h:720

References m_unitTypeMask, Object::m_updateFlag, m_vehicleKit, RemoveNpcFlag(), Vehicle::Uninstall(), UNIT_NPC_FLAG_PLAYER_VEHICLE, and UNIT_NPC_FLAG_SPELLCLICK.

Referenced by Dismount(), AuraEffect::HandleAuraSetVehicle(), npc_gunship::npc_gunshipAI::JustDied(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), spell_blood_queen_frenzied_bloodthirst_aura::OnRemove(), and RemoveFromWorld().

◆ RemoveVisibleAura()

void Unit::RemoveVisibleAura ( uint8  slot)
inline
1467{ m_visibleAuras.erase(slot); UpdateAuraForGroup(slot);}
void UpdateAuraForGroup(uint8 slot)
Definition Unit.cpp:17241

References m_visibleAuras, and UpdateAuraForGroup().

Referenced by AuraApplication::_Remove().

◆ ReplaceAllDynamicFlags()

◆ ReplaceAllNpcFlags()

void Unit::ReplaceAllNpcFlags ( NPCFlags  flags)
inline

References SetUInt32Value(), and UNIT_NPC_FLAGS.

Referenced by Pet::CreateBaseAtTamed(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), Spell::EffectSummonType(), SmartAI::EndPath(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFlagCommand(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_akama_illidan::JustSummoned(), Pet::LoadPetFromDB(), npc_pet_gen_argent_pony_bridle::OnGossipSelect(), npc_shandy_dalaran::OnGossipSelect(), go_crystalline_tear::OnQuestAccept(), boss_yoggsaron_descend_portal::boss_yoggsaron_descend_portalAI::OnSpellClick(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), boss_doomrel::boss_doomrelAI::Reset(), npc_eris_hevenfire::npc_eris_hevenfireAI::Reset(), npc_taretha::npc_tarethaAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Creature::setDeathState(), npc_eris_hevenfire::npc_eris_hevenfireAI::SetGUID(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_akama_illidan::sGossipSelect(), npc_escortAI::Start(), FollowerAI::StartFollow(), SmartAI::StartPath(), Player::SummonPet(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_lord_arete::npc_lord_areteAI::UpdateAI(), npc_pet_gen_argent_pony_bridle::UpdateAI(), Creature::UpdateEntry(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), GameEventMgr::UpdateEventNPCFlags(), and npc_captain_saeed::npc_captain_saeedAI::WaypointReached().

◆ ReplaceAllUnitFlags()

◆ ReplaceAllUnitFlags2()

void Unit::ReplaceAllUnitFlags2 ( UnitFlags2  flags)
inline

◆ resetAttackTimer()

◆ ResetRedirectThreat()

◆ RespondsToCallForHelp()

bool Unit::RespondsToCallForHelp ( ) const
inline
976 {
978 return entry->FactionRespondsToCallForHelp();
979
980 return false;
981 }

References GetFactionTemplateEntry().

Referenced by Creature::CanAssistTo().

◆ RestoreDisplayId()

void Unit::RestoreDisplayId ( )
16848{
16849 AuraEffect* handledAura = nullptr;
16850 AuraEffect* handledAuraForced = nullptr;
16851 // try to receive model from transform auras
16853 if (!transforms.empty())
16854 {
16855 // iterate over already applied transform auras - from newest to oldest
16856 for (auto i = transforms.rbegin(); i != transforms.rend(); ++i)
16857 {
16858 if (AuraApplication const* aurApp = (*i)->GetBase()->GetApplicationOfTarget(GetGUID()))
16859 {
16860 if (!handledAura)
16861 handledAura = (*i);
16862 // xinef: prefer negative/forced auras
16863 if ((*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR0_NO_IMMUNITIES) || !aurApp->IsPositive())
16864 {
16865 handledAuraForced = (*i);
16866 break;
16867 }
16868 }
16869 }
16870 }
16871
16872 // Xinef: include clone auras (eg mirror images)
16873 if (!handledAuraForced && !handledAura)
16874 {
16876 if (!cloneAuras.empty())
16877 for (Unit::AuraEffectList::const_iterator i = cloneAuras.begin(); i != cloneAuras.end(); ++i)
16878 handledAura = *i;
16879 }
16880
16882
16883 // xinef: order of execution is important!
16884 // first forced transform auras, then shapeshifts, then normal transform
16885 // transform aura was found
16886 if (handledAuraForced)
16887 {
16888 handledAuraForced->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16889 return;
16890 }
16891 else if (!shapeshiftAura.empty()) // we've found shapeshift
16892 {
16893 // only one such aura possible at a time
16894 if (uint32 modelId = GetModelForForm(GetShapeshiftForm(), shapeshiftAura.front()->GetId()))
16895 {
16896 SetDisplayId(modelId);
16897 return;
16898 }
16899 }
16900 else if (handledAura)
16901 {
16902 handledAura->HandleEffect(this, AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, true);
16903 return;
16904 }
16905
16906 // no auras found - set modelid to default
16908}
@ AURA_EFFECT_HANDLE_SEND_FOR_CLIENT
Definition SpellAuraDefines.h:43
void HandleEffect(AuraApplication *aurApp, uint8 mode, bool apply)
Definition SpellAuraEffects.cpp:748
uint32 GetModelForForm(ShapeshiftForm form, uint32 spellId)
Definition Unit.cpp:19286

References AURA_EFFECT_HANDLE_SEND_FOR_CLIENT, Aura::GetApplicationOfTarget(), GetAuraEffectsByType(), AuraApplication::GetBase(), Object::GetGUID(), GetModelForForm(), GetNativeDisplayId(), GetShapeshiftForm(), AuraEffect::HandleEffect(), SetDisplayId(), SPELL_ATTR0_NO_IMMUNITIES, SPELL_AURA_CLONE_CASTER, SPELL_AURA_MOD_SHAPESHIFT, and SPELL_AURA_TRANSFORM.

Referenced by AuraEffect::HandleAuraModShapeshift(), AuraEffect::HandleAuraTransform(), spell_gen_aura_service_uniform::OnRemove(), and Player::SetIsSpectator().

◆ RestoreFaction()

void Unit::RestoreFaction ( )
18782{
18783 if (IsPlayer())
18785 else
18786 {
18788 {
18789 if (Unit* owner = GetOwner())
18790 {
18791 SetFaction(owner->GetFaction());
18792 return;
18793 }
18794 }
18795
18796 if (CreatureTemplate const* cinfo = ToCreature()->GetCreatureTemplate()) // normal creature
18797 SetFaction(cinfo->faction);
18798 }
18799}
void SetFactionForRace(uint8 race)
Definition Player.cpp:5890

References GetOwner(), getRace(), HasUnitTypeMask(), Object::IsPlayer(), SetFaction(), Player::SetFactionForRace(), Object::ToCreature(), Object::ToPlayer(), and UNIT_MASK_MINION.

Referenced by npc_magister_aledis::DamageTaken(), npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::DamageTaken(), npc_death_knight_initiate::npc_death_knight_initiateAI::DamageTaken(), boss_thekal::DoAction(), AuraEffect::HandleAuraModFaction(), npc_commandscript::HandleNpcSetOriginalFaction(), npc_enslaved_netherwing_drake::JustDied(), npc_escortAI::JustRespawned(), SmartAI::JustRespawned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), RemoveCharmedBy(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_ahnqiraji_critter::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_magister_aledis::Reset(), npc_captain_saeed::npc_captain_saeedAI::Reset(), npc_bessy::npc_bessyAI::Reset(), and npc_enslaved_netherwing_drake::Reset().

◆ ResumeMovement()

void Unit::ResumeMovement ( uint32  timer = 0,
uint8  slot = 0 
)
16753{
16754 if (slot >= MAX_MOTION_SLOT)
16755 return;
16756
16757 if (MovementGenerator* movementGenerator = GetMotionMaster()->GetMotionSlot(slot))
16758 movementGenerator->Resume(timer);
16759}

References GetMotionMaster(), and MAX_MOTION_SLOT.

Referenced by boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), and npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI().

◆ RewardRage()

void Unit::RewardRage ( uint32  damage,
uint32  weaponSpeedHitFactor,
bool  attacker 
)
19956{
19957 // Rage formulae https://wowwiki-archive.fandom.com/wiki/Rage#Formulae
19958 float addRage;
19959
19960 float rageconversion = ((0.0091107836f * GetLevel() * GetLevel()) + 3.225598133f * GetLevel()) + 4.2652911f;
19961
19962 // Unknown if correct, but lineary adjust rage conversion above level 70
19963 if (GetLevel() > 70)
19964 rageconversion += 13.27f * (GetLevel() - 70);
19965
19966 if (attacker)
19967 {
19968 // see Bornak's bluepost explanation (05/29/2009)
19969 float rageFromDamageDealt = damage / rageconversion * 7.5f;
19970 addRage = (rageFromDamageDealt + weaponSpeedHitFactor) / 2.0f;
19971 addRage = std::min(addRage, rageFromDamageDealt * 2.0f);
19973 }
19974 else
19975 {
19976 addRage = damage / rageconversion * 2.5f;
19977
19978 // Berserker Rage effect
19979 if (HasAura(18499))
19980 addRage *= 3.0f;
19981 }
19982
19983 addRage *= sWorld->getRate(RATE_POWER_RAGE_INCOME);
19984
19985 ModifyPower(POWER_RAGE, uint32(addRage * 10));
19986}
@ SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT
Definition SpellAuraDefines.h:276
@ RATE_POWER_RAGE_INCOME
Definition WorldConfig.h:384

References AddPct(), GetLevel(), GetTotalAuraModifier(), HasAura(), ModifyPower(), POWER_RAGE, RATE_POWER_RAGE_INCOME, SPELL_AURA_MOD_RAGE_FROM_DAMAGE_DEALT, and sWorld.

Referenced by DealDamage(), and DealMeleeDamage().

◆ RollMeleeOutcomeAgainst() [1/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType 
) const
2812{
2813 // This is only wrapper
2814
2815 // Miss chance based on melee
2816 //float miss_chance = MeleeMissChanceCalc(victim, attType);
2817 float miss_chance = MeleeSpellMissChance(victim, attType, int32(GetWeaponSkillValue(attType, victim)) - int32(victim->GetMaxSkillValueForLevel(this)), 0);
2818
2819 // Critical hit chance
2820 float crit_chance = GetUnitCriticalChance(attType, victim);
2821 if (crit_chance < 0)
2822 crit_chance = 0;
2823
2824 float dodge_chance = victim->GetUnitDodgeChance();
2825 float block_chance = victim->GetUnitBlockChance();
2826 float parry_chance = victim->GetUnitParryChance();
2827
2828 // Useful if want to specify crit & miss chances for melee, else it could be removed
2829 //LOG_DEBUG("entities.unit", "MELEE OUTCOME: miss {} crit {} dodge {} parry {} block {}", miss_chance, crit_chance, dodge_chance, parry_chance, block_chance);
2830
2831 return RollMeleeOutcomeAgainst(victim, attType, int32(crit_chance * 100), int32(miss_chance * 100), int32(dodge_chance * 100), int32(parry_chance * 100), int32(block_chance * 100));
2832}
float GetUnitCriticalChance(WeaponAttackType attackType, Unit const *victim) const
Definition Unit.cpp:3756

References GetMaxSkillValueForLevel(), GetUnitBlockChance(), GetUnitCriticalChance(), GetUnitDodgeChance(), GetUnitParryChance(), GetWeaponSkillValue(), MeleeSpellMissChance(), and RollMeleeOutcomeAgainst().

Referenced by CalculateMeleeDamage(), and RollMeleeOutcomeAgainst().

◆ RollMeleeOutcomeAgainst() [2/2]

MeleeHitOutcome Unit::RollMeleeOutcomeAgainst ( Unit const *  victim,
WeaponAttackType  attType,
int32  crit_chance,
int32  miss_chance,
int32  dodge_chance,
int32  parry_chance,
int32  block_chance 
) const
2835{
2836 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks())
2837 {
2838 return MELEE_HIT_EVADE;
2839 }
2840
2841 int32 attackerMaxSkillValueForLevel = GetMaxSkillValueForLevel(victim);
2842 int32 victimMaxSkillValueForLevel = victim->GetMaxSkillValueForLevel(this);
2843
2844 int32 attackerWeaponSkill = GetWeaponSkillValue(attType, victim);
2845 int32 victimDefenseSkill = victim->GetDefenseSkillValue(this);
2846
2847 sScriptMgr->OnBeforeRollMeleeOutcomeAgainst(this, victim, attType, attackerMaxSkillValueForLevel, victimMaxSkillValueForLevel, attackerWeaponSkill, victimDefenseSkill, crit_chance, miss_chance, dodge_chance, parry_chance, block_chance);
2848
2849 // bonus from skills is 0.04%
2850 int32 skillBonus = 4 * (attackerWeaponSkill - victimMaxSkillValueForLevel);
2851 int32 sum = 0, tmp = 0;
2852 int32 roll = urand (0, 10000);
2853
2854 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: skill bonus of {} for attacker", skillBonus);
2855 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: rolled {}, miss {}, dodge {}, parry {}, block {}, crit {}",
2856 // roll, miss_chance, dodge_chance, parry_chance, block_chance, crit_chance);
2857
2858 tmp = miss_chance;
2859
2860 if (tmp > 0 && roll < (sum += tmp))
2861 {
2862 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: MISS");
2863 return MELEE_HIT_MISS;
2864 }
2865
2866 // Dodge chance
2867
2868 // only players can't dodge if attacker is behind
2869 if (victim->IsPlayer() && !victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2870 {
2871 //LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind and victim was a player.");
2872 }
2873 // Xinef: do not allow to dodge with CREATURE_FLAG_EXTRA_NO_DODGE flag
2874 else if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_DODGE)))
2875 {
2876 // Reduce dodge chance by attacker expertise rating
2877 if (IsPlayer())
2878 dodge_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2879 else
2880 dodge_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2881
2882 // Modify dodge chance by attacker SPELL_AURA_MOD_COMBAT_RESULT_CHANCE
2884 dodge_chance = int32 (float (dodge_chance) * GetTotalAuraMultiplier(SPELL_AURA_MOD_ENEMY_DODGE));
2885
2886 tmp = dodge_chance;
2887
2888 // xinef: if casting or stunned - cant dodge
2889 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2890 tmp = 0;
2891
2892 if ((tmp > 0) // check if unit _can_ dodge
2893 && ((tmp -= skillBonus) > 0)
2894 && roll < (sum += tmp))
2895 {
2896 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: DODGE <{}, {})", sum - tmp, sum);
2897 return MELEE_HIT_DODGE;
2898 }
2899 }
2900
2901 // parry & block chances
2902
2903 // check if attack comes from behind, nobody can parry or block if attacker is behind
2904 if (!victim->HasInArc(M_PI, this) && !victim->HasIgnoreHitDirectionAura())
2905 {
2906 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: attack came from behind.");
2907 }
2908 else
2909 {
2910 // Reduce parry chance by attacker expertise rating
2911 if (IsPlayer())
2912 parry_chance -= int32(ToPlayer()->GetExpertiseDodgeOrParryReduction(attType) * 100);
2913 else
2914 parry_chance -= GetTotalAuraModifier(SPELL_AURA_MOD_EXPERTISE) * 25;
2915
2916 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_PARRY)))
2917 {
2918 tmp = parry_chance;
2919
2920 // xinef: cant parry while casting or while stunned
2921 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2922 tmp = 0;
2923
2924 if (tmp > 0 // check if unit _can_ parry
2925 && (tmp -= skillBonus) > 0
2926 && roll < (sum += tmp))
2927 {
2928 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: PARRY <{}, {})", sum - tmp, sum);
2929 return MELEE_HIT_PARRY;
2930 }
2931 }
2932
2933 if (victim->IsPlayer() || !(victim->ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_BLOCK)))
2934 {
2935 tmp = block_chance;
2936
2937 // xinef: cant block while casting or while stunned
2938 if (victim->IsNonMeleeSpellCast(false, false, true) || victim->HasUnitState(UNIT_STATE_CONTROLLED))
2939 tmp = 0;
2940
2941 if (tmp > 0 // check if unit _can_ block
2942 && (tmp -= skillBonus) > 0
2943 && roll < (sum += tmp))
2944 {
2945 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: BLOCK <{}, {})", sum - tmp, sum);
2946 return MELEE_HIT_BLOCK;
2947 }
2948 }
2949 }
2950
2951 // Max 40% chance to score a glancing blow against mobs that are higher level (can do only players and pets and not with ranged weapon)
2952 if (attType != RANGED_ATTACK &&
2953 (IsPlayer() || IsPet()) &&
2954 !victim->IsPlayer() && !victim->IsPet() &&
2955 GetLevel() < victim->getLevelForTarget(this))
2956 {
2957 // cap possible value (with bonuses > max skill)
2958 int32 skill = attackerWeaponSkill;
2959 int32 maxskill = attackerMaxSkillValueForLevel;
2960 skill = (skill > maxskill) ? maxskill : skill;
2961
2962 tmp = (10 + (victimDefenseSkill - skill)) * 100;
2963 tmp = tmp > 4000 ? 4000 : tmp;
2964 if (roll < (sum += tmp))
2965 {
2966 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: GLANCING <{}, {})", sum - 4000, sum);
2967 return MELEE_HIT_GLANCING;
2968 }
2969 }
2970
2971 // mobs can score crushing blows if they're 4 or more levels above victim
2972 if (getLevelForTarget(victim) >= victim->getLevelForTarget(this) + 4 &&
2973 // can be from by creature (if can) or from controlled player that considered as creature
2976 {
2977 // when their weapon skill is 15 or more above victim's defense skill
2978 tmp = victimDefenseSkill;
2979 int32 tmpmax = victimMaxSkillValueForLevel;
2980 // having defense above your maximum (from items, talents etc.) has no effect
2981 tmp = tmp > tmpmax ? tmpmax : tmp;
2982 // tmp = mob's level * 5 - player's current defense skill
2983 tmp = attackerMaxSkillValueForLevel - tmp;
2984 if (tmp >= 15)
2985 {
2986 // add 2% chance per lacking skill point, min. is 15%
2987 tmp = tmp * 200 - 1500;
2988 if (roll < (sum += tmp))
2989 {
2990 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRUSHING <{}, {})", sum - tmp, sum);
2991 return MELEE_HIT_CRUSHING;
2992 }
2993 }
2994 }
2995
2996 // Critical chance
2997 tmp = crit_chance;
2998
2999 if (tmp > 0 && roll < (sum += tmp))
3000 {
3001 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT <{}, {})", sum - tmp, sum);
3002 if (IsCreature() && (ToCreature()->HasFlagsExtra(CREATURE_FLAG_EXTRA_NO_CRIT)))
3003 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: CRIT DISABLED)");
3004 else
3005 return MELEE_HIT_CRIT;
3006 }
3007
3008 LOG_DEBUG("entities.unit", "RollMeleeOutcomeAgainst: NORMAL");
3009 return MELEE_HIT_NORMAL;
3010}
@ CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS
Definition CreatureData.h:50
@ CREATURE_FLAG_EXTRA_NO_CRIT
Definition CreatureData.h:62

References CREATURE_FLAG_EXTRA_NO_BLOCK, CREATURE_FLAG_EXTRA_NO_CRIT, CREATURE_FLAG_EXTRA_NO_CRUSHING_BLOWS, CREATURE_FLAG_EXTRA_NO_DODGE, CREATURE_FLAG_EXTRA_NO_PARRY, GetDefenseSkillValue(), GetLevel(), getLevelForTarget(), GetMaxSkillValueForLevel(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscValue(), GetTotalAuraMultiplier(), GetWeaponSkillValue(), Creature::HasFlagsExtra(), HasIgnoreHitDirectionAura(), Position::HasInArc(), HasUnitState(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsNonMeleeSpellCast(), IsPet(), Object::IsPlayer(), LOG_DEBUG, MELEE_HIT_BLOCK, MELEE_HIT_CRIT, MELEE_HIT_CRUSHING, MELEE_HIT_DODGE, MELEE_HIT_EVADE, MELEE_HIT_GLANCING, MELEE_HIT_MISS, MELEE_HIT_NORMAL, MELEE_HIT_PARRY, RANGED_ATTACK, SPELL_AURA_MOD_COMBAT_RESULT_CHANCE, SPELL_AURA_MOD_ENEMY_DODGE, SPELL_AURA_MOD_EXPERTISE, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONTROLLED, urand(), and VICTIMSTATE_DODGE.

◆ Say() [1/2]

◆ Say() [2/2]

void Unit::Say ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21055{
21056 Talk(textId, CHAT_MSG_MONSTER_SAY, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_SAY), target);
21057}

References CHAT_MSG_MONSTER_SAY, CONFIG_LISTEN_RANGE_SAY, and sWorld.

◆ SelectNearbyNoTotemTarget()

Unit * Unit::SelectNearbyNoTotemTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17092{
17093 std::list<Unit*> targets;
17094 Acore::AnyUnfriendlyNoTotemUnitInObjectRangeCheck u_check(this, this, dist);
17096 Cell::VisitAllObjects(this, searcher, dist);
17097
17098 // remove current target
17099 if (GetVictim())
17100 targets.remove(GetVictim());
17101
17102 if (exclude)
17103 targets.remove(exclude);
17104
17105 // remove not LoS targets
17106 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17107 {
17108 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17109 {
17110 std::list<Unit*>::iterator tIter2 = tIter;
17111 ++tIter;
17112 targets.erase(tIter2);
17113 }
17114 else
17115 ++tIter;
17116 }
17117
17118 // no appropriate targets
17119 if (targets.empty())
17120 return nullptr;
17121
17122 // select random
17124}
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:13961
auto SelectRandomContainerElement(C const &container) -> typename std::add_const< decltype(*std::begin(container))>::type &
Definition Containers.h:133
Definition GridNotifiers.h:413

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by spell_rog_blade_flurry::CheckProc(), and spell_warr_sweeping_strikes::CheckProc().

◆ SelectNearbyTarget()

Unit * Unit::SelectNearbyTarget ( Unit exclude = nullptr,
float  dist = NOMINAL_MELEE_RANGE 
) const
17057{
17058 std::list<Unit*> targets;
17059 Acore::AnyUnfriendlyUnitInObjectRangeCheck u_check(this, this, dist);
17061 Cell::VisitAllObjects(this, searcher, dist);
17062
17063 // remove current target
17064 if (GetVictim())
17065 targets.remove(GetVictim());
17066
17067 if (exclude)
17068 targets.remove(exclude);
17069
17070 // remove not LoS targets
17071 for (std::list<Unit*>::iterator tIter = targets.begin(); tIter != targets.end();)
17072 {
17073 if (!IsWithinLOSInMap(*tIter) || !IsValidAttackTarget(*tIter))
17074 {
17075 std::list<Unit*>::iterator tIter2 = tIter;
17076 ++tIter;
17077 targets.erase(tIter2);
17078 }
17079 else
17080 ++tIter;
17081 }
17082
17083 // no appropriate targets
17084 if (targets.empty())
17085 return nullptr;
17086
17087 // select random
17089}
Definition GridNotifiers.h:851

References GetVictim(), IsValidAttackTarget(), WorldObject::IsWithinLOSInMap(), Acore::Containers::SelectRandomContainerElement(), and Cell::VisitAllObjects().

Referenced by boss_yazzai::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_curator::JustSummoned(), npc_hodirs_fury::npc_hodirs_furyAI::UpdateAI(), npc_storm_beacon_spawn::npc_storm_beacon_spawnAI::UpdateAI(), boss_kologarn::boss_kologarnAI::UpdateAI(), boss_thorim_trap::boss_thorim_trapAI::UpdateAI(), npc_llod_generic::npc_llod_genericAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), Player::UpdateCharmedAI(), and boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::UpdateEscortAI().

◆ SendAttackStateUpdate() [1/2]

void Unit::SendAttackStateUpdate ( CalcDamageInfo damageInfo)

Probably used for debugging purposes, as it is not known to appear on retail servers

6567{
6568 LOG_DEBUG("entities.unit", "WORLD: Sending SMSG_ATTACKERSTATEUPDATE");
6569
6570 uint32 tmpDamage[MAX_ITEM_PROTO_DAMAGES] = { };
6571 uint32 tmpAbsorb[MAX_ITEM_PROTO_DAMAGES] = { };
6572 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
6573 {
6574 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6575 tmpDamage[i] = damageInfo->damages[i].damage;
6576 tmpAbsorb[i] = damageInfo->damages[i].absorb;
6577 if (damageInfo->target->IsPlayer() && damageInfo->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6578 {
6579 tmpAbsorb[i] = tmpDamage[i];
6580 tmpDamage[i] = 0;
6581 }
6582 }
6583
6584 uint32 count = 1;
6585 if (tmpDamage[1] || tmpAbsorb[1] || damageInfo->damages[1].resist)
6586 {
6587 ++count;
6588 }
6589
6590 std::size_t const maxsize = 4 + 5 + 5 + 4 + 4 + 1 + count * (4 + 4 + 4 + 4 + 4) + 1 + 4 + 4 + 4 + 4 + 4 * 12;
6591 WorldPacket data(SMSG_ATTACKERSTATEUPDATE, maxsize); // we guess size
6592 data << uint32(damageInfo->HitInfo);
6593 data << damageInfo->attacker->GetPackGUID();
6594 data << damageInfo->target->GetPackGUID();
6595 data << uint32(tmpDamage[0] + tmpDamage[1]); // Full damage
6596 int32 overkill = tmpDamage[0] + tmpDamage[1] - damageInfo->target->GetHealth();
6597 data << uint32(overkill < 0 ? 0 : overkill); // Overkill
6598 data << uint8(count); // Sub damage count
6599
6600 for (uint32 i = 0; i < count; ++i)
6601 {
6602 data << uint32(damageInfo->damages[i].damageSchoolMask); // School of sub damage
6603 data << float(tmpDamage[i]); // sub damage
6604 data << uint32(tmpDamage[i]); // Sub Damage
6605 }
6606
6608 {
6609 for (uint32 i = 0; i < count; ++i)
6610 {
6611 data << uint32(tmpAbsorb[i]); // Absorb
6612 }
6613 }
6614
6616 {
6617 for (uint32 i = 0; i < count; ++i)
6618 {
6619 data << uint32(damageInfo->damages[i].resist); // Resist
6620 }
6621 }
6622
6623 data << uint8(damageInfo->TargetState);
6624 data << uint32(0); // Unknown attackerstate
6625 data << uint32(0); // Melee spellid
6626
6627 if (damageInfo->HitInfo & HITINFO_BLOCK)
6628 data << uint32(damageInfo->blocked_amount);
6629
6630 if (damageInfo->HitInfo & HITINFO_RAGE_GAIN)
6631 data << uint32(0);
6632
6634 if (damageInfo->HitInfo & HITINFO_UNK1)
6635 {
6636 data << uint32(0);
6637 data << float(0);
6638 data << float(0);
6639 data << float(0);
6640 data << float(0);
6641 data << float(0);
6642 data << float(0);
6643 data << float(0);
6644 data << float(0);
6645 data << float(0); // Found in a loop with 1 iteration
6646 data << float(0); // ditto ^
6647 data << uint32(0);
6648 }
6649
6650 SendMessageToSet(&data, true);
6651}
@ HITINFO_RAGE_GAIN
Definition Unit.h:121
@ HITINFO_UNK1
Definition Unit.h:98
@ SMSG_ATTACKERSTATEUPDATE
Definition Opcodes.h:360

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CHEAT_GOD, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), CalcDamageInfo::HitInfo, HITINFO_BLOCK, HITINFO_FULL_ABSORB, HITINFO_FULL_RESIST, HITINFO_PARTIAL_ABSORB, HITINFO_PARTIAL_RESIST, HITINFO_RAGE_GAIN, HITINFO_UNK1, Object::IsPlayer(), LOG_DEBUG, MAX_ITEM_PROTO_DAMAGES, CalcDamageInfo::resist, WorldObject::SendMessageToSet(), SMSG_ATTACKERSTATEUPDATE, CalcDamageInfo::target, CalcDamageInfo::TargetState, and Object::ToPlayer().

Referenced by AttackerStateUpdate(), misc_commandscript::HandleDamageCommand(), spell_dk_dancing_rune_weapon::HandleProc(), and SendAttackStateUpdate().

◆ SendAttackStateUpdate() [2/2]

void Unit::SendAttackStateUpdate ( uint32  HitInfo,
Unit target,
uint8  SwingType,
SpellSchoolMask  damageSchoolMask,
uint32  Damage,
uint32  AbsorbDamage,
uint32  Resist,
VictimState  TargetState,
uint32  BlockedAmount 
)
6654{
6655 CalcDamageInfo dmgInfo;
6656 dmgInfo.HitInfo = HitInfo;
6657 dmgInfo.attacker = this;
6658 dmgInfo.target = target;
6659
6660 dmgInfo.damages[0].damage = Damage - AbsorbDamage - Resist - BlockedAmount;
6661 dmgInfo.damages[0].damageSchoolMask = damageSchoolMask;
6662 dmgInfo.damages[0].absorb = AbsorbDamage;
6663 dmgInfo.damages[0].resist = Resist;
6664
6665 dmgInfo.damages[1].damage = 0;
6666 dmgInfo.damages[1].damageSchoolMask = 0;
6667 dmgInfo.damages[1].absorb = 0;
6668 dmgInfo.damages[1].resist = 0;
6669
6670 dmgInfo.TargetState = TargetState;
6671 dmgInfo.blocked_amount = BlockedAmount;
6672 SendAttackStateUpdate(&dmgInfo);
6673}
HitInfo
Definition Unit.h:96

References CalcDamageInfo::absorb, CalcDamageInfo::attacker, CalcDamageInfo::blocked_amount, CalcDamageInfo::damage, CalcDamageInfo::damages, CalcDamageInfo::damageSchoolMask, CalcDamageInfo::HitInfo, CalcDamageInfo::resist, SendAttackStateUpdate(), CalcDamageInfo::target, and CalcDamageInfo::TargetState.

◆ SendChangeCurrentVictimOpcode()

void Unit::SendChangeCurrentVictimOpcode ( HostileReference pHostileReference)
19918{
19919 if (!GetThreatMgr().isThreatListEmpty())
19920 {
19921 uint32 count = GetThreatMgr().GetThreatList().size();
19922
19923 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_HIGHEST_THREAT_UPDATE Message");
19924 WorldPacket data(SMSG_HIGHEST_THREAT_UPDATE, 8 + 8 + count * 8);
19925 data << GetPackGUID();
19926 data << pHostileReference->getUnitGuid().WriteAsPacked();
19927 data << uint32(count);
19929 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19930 {
19931 data << (*itr)->getUnitGuid().WriteAsPacked();
19932 data << uint32((*itr)->GetThreat() * 100);
19933 }
19934 SendMessageToSet(&data, false);
19935 }
19936}
PackedGuid WriteAsPacked() const
Definition ObjectGuid.h:316
std::list< HostileReference * > StorageType
Definition ThreatMgr.h:147
@ SMSG_HIGHEST_THREAT_UPDATE
Definition Opcodes.h:1184

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_HIGHEST_THREAT_UPDATE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::setCurrentVictim().

◆ SendClearTarget()

void Unit::SendClearTarget ( )
20164{
20166 data << GetPackGUID();
20167 SendMessageToSet(&data, false);
20168}
@ SMSG_BREAK_TARGET
Definition Opcodes.h:368

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_BREAK_TARGET.

Referenced by Vehicle::AddPassenger(), and Spell::EffectForceDeselect().

◆ SendClearThreatListOpcode()

void Unit::SendClearThreatListOpcode ( )
19939{
19940 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_CLEAR Message");
19942 data << GetPackGUID();
19943 SendMessageToSet(&data, false);
19944}
@ SMSG_THREAT_CLEAR
Definition Opcodes.h:1187

References Object::GetPackGUID(), LOG_DEBUG, WorldObject::SendMessageToSet(), and SMSG_THREAT_CLEAR.

Referenced by ThreatMgr::ClearAllThreat().

◆ SendComboPoints()

void Unit::SendComboPoints ( )
16954{
16955 if (m_cleanupDone)
16956 {
16957 return;
16958 }
16959
16961 if (Player* playerMe = ToPlayer())
16962 {
16963 WorldPacket data(SMSG_UPDATE_COMBO_POINTS, packGUID.size() + 1);
16964 data << packGUID;
16965 data << uint8(m_comboPoints);
16966 playerMe->SendDirectMessage(&data);
16967 }
16968
16969 ObjectGuid ownerGuid = GetCharmerOrOwnerGUID();
16970 Player* owner = nullptr;
16971 if (ownerGuid.IsPlayer())
16972 {
16973 owner = ObjectAccessor::GetPlayer(*this, ownerGuid);
16974 }
16975
16976 if (m_movedByPlayer || owner)
16977 {
16978 WorldPacket data(SMSG_PET_UPDATE_COMBO_POINTS, GetPackGUID().size() + packGUID.size() + 1);
16979 data << GetPackGUID();
16980 data << packGUID;
16981 data << uint8(m_comboPoints);
16982
16983 if (m_movedByPlayer)
16985
16986 if (owner && owner != m_movedByPlayer)
16987 owner->SendDirectMessage(&data);
16988 }
16989}
Definition ObjectGuid.h:263
std::size_t size() const
Definition ObjectGuid.h:274
@ SMSG_PET_UPDATE_COMBO_POINTS
Definition Opcodes.h:1200
@ SMSG_UPDATE_COMBO_POINTS
Definition Opcodes.h:955

References GetCharmerOrOwnerGUID(), Object::GetPackGUID(), ObjectAccessor::GetPlayer(), ObjectGuid::IsPlayer(), m_cleanupDone, m_comboPoints, m_comboTarget, m_movedByPlayer, Player::SendDirectMessage(), PackedGuid::size(), SMSG_PET_UPDATE_COMBO_POINTS, SMSG_UPDATE_COMBO_POINTS, and Object::ToPlayer().

Referenced by AddComboPoints(), and ClearComboPoints().

◆ SendEnergizeSpellLog()

void Unit::SendEnergizeSpellLog ( Unit victim,
uint32  SpellID,
uint32  Damage,
Powers  powertype 
)
11344{
11345 WorldPacket data(SMSG_SPELLENERGIZELOG, (8 + 8 + 4 + 4 + 4 + 1));
11346 data << victim->GetPackGUID();
11347 data << GetPackGUID();
11348 data << uint32(spellID);
11349 data << uint32(powerType);
11350 data << uint32(damage);
11351 SendMessageToSet(&data, true);
11352}
@ SMSG_SPELLENERGIZELOG
Definition Opcodes.h:367

References Object::GetPackGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLENERGIZELOG.

Referenced by EnergizeBySpell(), and AuraEffect::HandlePeriodicTriggerSpellAuraTick().

◆ SendHealSpellLog()

void Unit::SendHealSpellLog ( HealInfo const &  healInfo,
bool  critical = false 
)
11311{
11312 uint32 overheal = healInfo.GetHeal() - healInfo.GetEffectiveHeal();
11313
11314 // we guess size
11315 WorldPacket data(SMSG_SPELLHEALLOG, (8 + 8 + 4 + 4 + 4 + 4 + 1 + 1));
11316 data << healInfo.GetTarget()->GetPackGUID();
11317 data << GetPackGUID();
11318 data << uint32(healInfo.GetSpellInfo()->Id);
11319 data << uint32(healInfo.GetHeal());
11320 data << uint32(overheal);
11321 data << uint32(healInfo.GetAbsorb()); // Absorb amount
11322 data << uint8(critical ? 1 : 0);
11323 data << uint8(0); // unused
11324 SendMessageToSet(&data, true);
11325}
@ SMSG_SPELLHEALLOG
Definition Opcodes.h:366

References HealInfo::GetAbsorb(), HealInfo::GetEffectiveHeal(), HealInfo::GetHeal(), Object::GetPackGUID(), HealInfo::GetSpellInfo(), HealInfo::GetTarget(), SpellInfo::Id, WorldObject::SendMessageToSet(), and SMSG_SPELLHEALLOG.

Referenced by HealBySpell().

◆ SendMeleeAttackStart()

void Unit::SendMeleeAttackStart ( Unit victim,
Player sendTo = nullptr 
)
3090{
3091 WorldPacket data(SMSG_ATTACKSTART, 8 + 8);
3092 data << GetGUID();
3093 data << victim->GetGUID();
3094 if (sendTo)
3095 sendTo->SendDirectMessage(&data);
3096 else
3097 SendMessageToSet(&data, true);
3098 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTART");
3099}
@ SMSG_ATTACKSTART
Definition Opcodes.h:353

References Object::GetGUID(), Object::GetGUID(), LOG_DEBUG, Player::SendDirectMessage(), WorldObject::SendMessageToSet(), and SMSG_ATTACKSTART.

Referenced by Attack(), Player::GetInitialVisiblePackets(), and boss_leotheras_the_blind::Reset().

◆ SendMeleeAttackStop()

void Unit::SendMeleeAttackStop ( Unit victim = nullptr)

Send to the client SMSG_ATTACKSTOP but doesn't clear UNIT_STATE_MELEE_ATTACKING on server side or interrupt spells. Unless you know exactly what you're doing, use AttackStop() or RemoveAllAttackers() instead.

3106{
3107 // pussywizard: calling SendMeleeAttackStop without clearing UNIT_STATE_MELEE_ATTACKING and then AttackStart the same player may spoil npc rotating!
3108 // pussywizard: this happens in some boss scripts, just add clearing here
3109 // ClearUnitState(UNIT_STATE_MELEE_ATTACKING); // commented out for now
3110
3111 WorldPacket data(SMSG_ATTACKSTOP, (8 + 8 + 4));
3112 data << GetPackGUID();
3113
3114 if (victim)
3115 {
3116 data << victim->GetPackGUID();
3117 data << (uint32)victim->isDead();
3118 }
3119 SendMessageToSet(&data, true);
3120 LOG_DEBUG("entities.unit", "WORLD: Sent SMSG_ATTACKSTOP");
3121
3122 if (victim)
3123 LOG_DEBUG("entities.unit", "{} {} stopped attacking {} {}", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString(), (victim->IsPlayer() ? "player" : "creature"), victim->GetGUID().ToString());
3124 else
3125 LOG_DEBUG("entities.unit", "{} {} stopped attacking", (IsPlayer() ? "Player" : "Creature"), GetGUID().ToString());
3126}
bool isDead() const
Definition Unit.h:1709
@ SMSG_ATTACKSTOP
Definition Opcodes.h:354

References Object::GetGUID(), Object::GetGUID(), Object::GetPackGUID(), isDead(), Object::IsPlayer(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_ATTACKSTOP, and ObjectGuid::ToString().

Referenced by Attack(), AttackStop(), boss_garfrost::boss_garfrostAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), spell_svalna_revive_champion::Land(), boss_leotheras_the_blind::Reset(), SetControlled(), boss_razorscale::boss_razorscaleAI::SpellHit(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), and boss_razorscale::boss_razorscaleAI::UpdateAI().

◆ SendMonsterMove()

void Unit::SendMonsterMove ( float  NewPosX,
float  NewPosY,
float  NewPosZ,
uint32  TransitTime,
SplineFlags  sf = SPLINEFLAG_WALK_MODE 
)
539{
540 WorldPacket data(SMSG_MONSTER_MOVE, 1 + 12 + 4 + 1 + 4 + 4 + 4 + 12 + GetPackGUID().size());
541 data << GetPackGUID();
542
543 data << uint8(0); // new in 3.1
544 data << GetPositionX() << GetPositionY() << GetPositionZ();
545 data << GameTime::GetGameTimeMS().count();
546 data << uint8(0);
547 data << uint32(sf);
548 data << TransitTime; // Time in between points
549 data << uint32(1); // 1 single waypoint
550 data << NewPosX << NewPosY << NewPosZ; // the single waypoint Point B
551
552 SendMessageToSet(&data, true);
553}
@ SMSG_MONSTER_MOVE
Definition Opcodes.h:251

References GameTime::GetGameTimeMS(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), WorldObject::SendMessageToSet(), and SMSG_MONSTER_MOVE.

Referenced by npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI().

◆ SendMovementFeatherFall()

void Unit::SendMovementFeatherFall ( Player sendTo)
20522{
20523 if (!movespline->Initialized())
20524 return;
20526 data << GetPackGUID();
20527 sendTo->SendDirectMessage(&data);
20528}
@ SMSG_SPLINE_MOVE_FEATHER_FALL
Definition Opcodes.h:803

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_FEATHER_FALL.

Referenced by Player::GetAurasForTarget().

◆ SendMovementFlagUpdate()

void Unit::SendMovementFlagUpdate ( bool  self = false)
16777{
16778 WorldPacket data;
16779 BuildHeartBeatMsg(&data);
16780 SendMessageToSet(&data, self);
16781}
void BuildHeartBeatMsg(WorldPacket *data) const
Definition Object.cpp:2066

References BuildHeartBeatMsg(), and WorldObject::SendMessageToSet().

Referenced by boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_ball_of_flame::npc_ball_of_flameAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), npc_madrigosa::DoAction(), boss_nightbane::EnterEvadeMode(), boss_kaelthas::ExecuteMiddleEvent(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), boss_felmyst::InitializeAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_harbinger_skyriss::JustSummoned(), MotionMaster::MoveFall(), npc_twilight_volunteer::MovementInform(), boss_felmyst::MovementInform(), npc_eoe_wyrmrest_skytalon::npc_eoe_wyrmrest_skytalonAI::PassengerBoarded(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), npc_dancing_flames::npc_dancing_flamesAI::Reset(), boss_felmyst::ScheduleGroundAbilities(), SetCharm(), SetHover(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_felmyst::StartIntro(), boss_nightbane::TriggerHealthTakeOff(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), boss_koralon::boss_koralonAI::UpdateAI(), Player::UpdateCharmedAI(), and brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI().

◆ SendMovementHover()

void Unit::SendMovementHover ( Player sendTo)
20559{
20560 if (!movespline->Initialized())
20561 return;
20563 data << GetPackGUID();
20564 sendTo->SendDirectMessage(&data);
20565}
@ SMSG_SPLINE_MOVE_SET_HOVER
Definition Opcodes.h:805

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_SET_HOVER.

Referenced by Player::GetAurasForTarget().

◆ SendMovementWaterWalking()

void Unit::SendMovementWaterWalking ( Player sendTo)
20500{
20501 if (!movespline->Initialized())
20502 return;
20504 data << GetPackGUID();
20505 sendTo->SendDirectMessage(&data);
20506}
@ SMSG_SPLINE_MOVE_WATER_WALK
Definition Opcodes.h:807

References Object::GetPackGUID(), Movement::MoveSpline::Initialized(), movespline, Player::SendDirectMessage(), and SMSG_SPLINE_MOVE_WATER_WALK.

Referenced by Player::GetAurasForTarget().

◆ SendPeriodicAuraLog()

void Unit::SendPeriodicAuraLog ( SpellPeriodicAuraLogInfo pInfo)
6477{
6478 AuraEffect const* aura = pInfo->auraEff;
6480 data << GetPackGUID();
6481 data << aura->GetCasterGUID().WriteAsPacked();
6482 data << uint32(aura->GetId()); // spellId
6483 data << uint32(1); // count
6484 data << uint32(aura->GetAuraType()); // auraId
6485 switch (aura->GetAuraType())
6486 {
6489 {
6490 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6491 uint32 damage = pInfo->damage;
6492 uint32 absorb = pInfo->absorb;
6493 if (IsPlayer() && ToPlayer()->GetCommandStatus(CHEAT_GOD))
6494 {
6495 absorb = damage;
6496 damage = 0;
6497 }
6498
6499 data << uint32(damage); // damage
6500 data << uint32(pInfo->overDamage); // overkill?
6501 data << uint32(aura->GetSpellInfo()->GetSchoolMask());
6502 data << uint32(absorb); // absorb
6503 data << uint32(pInfo->resist); // resist
6504 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6505 }
6506 break;
6509 data << uint32(pInfo->damage); // damage
6510 data << uint32(pInfo->overDamage); // overheal
6511 data << uint32(pInfo->absorb); // absorb
6512 data << uint8(pInfo->critical); // new 3.1.2 critical tick
6513 break;
6516 data << uint32(aura->GetMiscValue()); // power type
6517 data << uint32(pInfo->damage); // damage
6518 break;
6520 data << uint32(aura->GetMiscValue()); // power type
6521 data << uint32(pInfo->damage); // amount
6522 data << float(pInfo->multiplier); // gain multiplier
6523 break;
6524 default:
6525 LOG_ERROR("entities.unit", "Unit::SendPeriodicAuraLog: unknown aura {}", uint32(aura->GetAuraType()));
6526 return;
6527 }
6528
6529 SendMessageToSet(&data, true);
6530}
@ SPELL_AURA_OBS_MOD_HEALTH
Definition SpellAuraDefines.h:83
@ SPELL_AURA_PERIODIC_MANA_LEECH
Definition SpellAuraDefines.h:127
@ SPELL_AURA_PERIODIC_ENERGIZE
Definition SpellAuraDefines.h:87
@ SMSG_PERIODICAURALOG
Definition Opcodes.h:620
float multiplier
Definition Unit.h:522
bool critical
Definition Unit.h:523
uint32 overDamage
Definition Unit.h:519
uint32 resist
Definition Unit.h:521
uint32 damage
Definition Unit.h:518
AuraEffect const * auraEff
Definition Unit.h:517
uint32 absorb
Definition Unit.h:520

References SpellPeriodicAuraLogInfo::absorb, SpellPeriodicAuraLogInfo::auraEff, CHEAT_GOD, SpellPeriodicAuraLogInfo::critical, SpellPeriodicAuraLogInfo::damage, AuraEffect::GetAuraType(), AuraEffect::GetCasterGUID(), AuraEffect::GetId(), AuraEffect::GetMiscValue(), Object::GetPackGUID(), SpellInfo::GetSchoolMask(), AuraEffect::GetSpellInfo(), Object::IsPlayer(), LOG_ERROR, SpellPeriodicAuraLogInfo::multiplier, SpellPeriodicAuraLogInfo::overDamage, SpellPeriodicAuraLogInfo::resist, WorldObject::SendMessageToSet(), SMSG_PERIODICAURALOG, SPELL_AURA_OBS_MOD_HEALTH, SPELL_AURA_OBS_MOD_POWER, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_PERIODIC_DAMAGE_PERCENT, SPELL_AURA_PERIODIC_ENERGIZE, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_MANA_LEECH, Object::ToPlayer(), and ObjectGuid::WriteAsPacked().

Referenced by AuraEffect::HandleObsModPowerAuraTick(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicEnergizeAuraTick(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SendPetActionFeedback()

void Unit::SendPetActionFeedback ( uint8  msg)

-------—Pet responses methods--------------—

16681{
16682 Unit* owner = GetOwner();
16683 if (!owner || !owner->IsPlayer())
16684 return;
16685
16687 data << uint8(msg);
16688 owner->ToPlayer()->GetSession()->SendPacket(&data);
16689}
@ SMSG_PET_ACTION_FEEDBACK
Definition Opcodes.h:740

References GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_FEEDBACK, and Object::ToPlayer().

Referenced by WorldSession::HandlePetCancelAuraOpcode().

◆ SendPetAIReaction()

void Unit::SendPetAIReaction ( ObjectGuid  guid)
16704{
16705 Unit* owner = GetOwner();
16706 if (!owner || !owner->IsPlayer())
16707 return;
16708
16709 WorldPacket data(SMSG_AI_REACTION, 8 + 4);
16710 data << guid;
16711 data << uint32(AI_REACTION_HOSTILE);
16712 owner->ToPlayer()->GetSession()->SendPacket(&data);
16713}
@ SMSG_AI_REACTION
Definition Opcodes.h:346

References AI_REACTION_HOSTILE, GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_AI_REACTION, and Object::ToPlayer().

Referenced by PetAI::DoAttack(), and WorldSession::HandlePetActionHelper().

◆ SendPetTalk()

void Unit::SendPetTalk ( uint32  pettalk)
16692{
16693 Unit* owner = GetOwner();
16694 if (!owner || !owner->IsPlayer())
16695 return;
16696
16698 data << GetGUID();
16699 data << uint32(pettalk);
16700 owner->ToPlayer()->GetSession()->SendPacket(&data);
16701}
@ SMSG_PET_ACTION_SOUND
Definition Opcodes.h:834

References Object::GetGUID(), GetOwner(), Player::GetSession(), Object::IsPlayer(), WorldSession::SendPacket(), SMSG_PET_ACTION_SOUND, and Object::ToPlayer().

Referenced by WorldSession::HandlePetActionHelper().

◆ SendPlaySpellImpact()

void Unit::SendPlaySpellImpact ( ObjectGuid  guid,
uint32  id 
)
19006{
19008 data << guid; // target
19009 data << uint32(id); // SpellVisualKit.dbc index
19010 SendMessageToSet(&data, true);
19011}
@ SMSG_PLAY_SPELL_IMPACT
Definition Opcodes.h:533

References WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_IMPACT.

Referenced by debug_commandscript::HandleDebugVisualCommand(), and WorldSession::HandleTrainerBuySpellOpcode().

◆ SendPlaySpellVisual()

void Unit::SendPlaySpellVisual ( uint32  id)
18998{
19000 data << GetGUID();
19001 data << uint32(id); // SpellVisualKit.dbc index
19002 SendMessageToSet(&data, true);
19003}
@ SMSG_PLAY_SPELL_VISUAL
Definition Opcodes.h:529

References Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PLAY_SPELL_VISUAL.

Referenced by debug_commandscript::HandleDebugVisualCommand(), WorldSession::HandleTrainerBuySpellOpcode(), SmartScript::ProcessAction(), and Player::RegenerateAll().

◆ SendRemoveFromThreatListOpcode()

void Unit::SendRemoveFromThreatListOpcode ( HostileReference pHostileReference)
19947{
19948 LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_REMOVE Message");
19949 WorldPacket data(SMSG_THREAT_REMOVE, 8 + 8);
19950 data << GetPackGUID();
19951 data << pHostileReference->getUnitGuid().WriteAsPacked();
19952 SendMessageToSet(&data, false);
19953}
@ SMSG_THREAT_REMOVE
Definition Opcodes.h:1186

References Object::GetPackGUID(), HostileReference::getUnitGuid(), LOG_DEBUG, WorldObject::SendMessageToSet(), SMSG_THREAT_REMOVE, and ObjectGuid::WriteAsPacked().

Referenced by ThreatMgr::processThreatEvent().

◆ SendSpellDamageImmune()

void Unit::SendSpellDamageImmune ( Unit target,
uint32  spellId 
)
6557{
6558 WorldPacket data(SMSG_SPELLORDAMAGE_IMMUNE, 8 + 8 + 4 + 1);
6559 data << GetGUID();
6560 data << target->GetGUID();
6561 data << uint32(spellId);
6562 data << uint8(0); // bool - log format: 0-default, 1-debug
6563 SendMessageToSet(&data, true);
6564}
@ SMSG_SPELLORDAMAGE_IMMUNE
Definition Opcodes.h:641

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLORDAMAGE_IMMUNE.

Referenced by DealMeleeDamage(), Spell::EffectEnergize(), Spell::EffectHealMaxHealth(), and AuraEffect::SendTickImmune().

◆ SendSpellDamageResist()

void Unit::SendSpellDamageResist ( Unit target,
uint32  spellId 
)
6547{
6548 WorldPacket data(SMSG_PROCRESIST, 8 + 8 + 4 + 1);
6549 data << GetGUID();
6550 data << target->GetGUID();
6551 data << uint32(spellId);
6552 data << uint8(0); // bool - log format: 0-default, 1-debug
6553 SendMessageToSet(&data, true);
6554}
@ SMSG_PROCRESIST
Definition Opcodes.h:638

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_PROCRESIST.

◆ SendSpellMiss()

void Unit::SendSpellMiss ( Unit target,
uint32  spellID,
SpellMissInfo  missInfo 
)
6533{
6534 WorldPacket data(SMSG_SPELLLOGMISS, (4 + 8 + 1 + 4 + 8 + 1));
6535 data << uint32(spellID);
6536 data << GetGUID();
6537 data << uint8(0); // can be 0 or 1
6538 data << uint32(1); // target count
6539 // for (i = 0; i < target count; ++i)
6540 data << target->GetGUID(); // target GUID
6541 data << uint8(missInfo);
6542 // end loop
6543 SendMessageToSet(&data, true);
6544}
@ SMSG_SPELLLOGMISS
Definition Opcodes.h:617

References Object::GetGUID(), Object::GetGUID(), WorldObject::SendMessageToSet(), and SMSG_SPELLLOGMISS.

Referenced by DealMeleeDamage(), and Spell::DoAllEffectOnTarget().

◆ SendSpellNonMeleeDamageLog() [1/2]

void Unit::SendSpellNonMeleeDamageLog ( SpellNonMeleeDamage log)
6398{
6399 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6400 //IF we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our hp bar will not drop
6401 uint32 damage = log->damage;
6402 uint32 absorb = log->absorb;
6403 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6404 {
6405 absorb = damage;
6406 damage = 0;
6407 }
6408 data << log->target->GetPackGUID();
6409 data << log->attacker->GetPackGUID();
6410 data << uint32(log->spellInfo->Id);
6411 data << uint32(damage); // damage amount
6412 int32 overkill = damage - log->target->GetHealth();
6413 data << uint32(overkill > 0 ? overkill : 0); // overkill
6414 data << uint8 (log->schoolMask); // damage school
6415 data << uint32(absorb); // AbsorbedDamage
6416 data << uint32(log->resist); // resist
6417 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6418 data << uint8 (log->unused); // unused
6419 data << uint32(log->blocked); // blocked
6420 data << uint32(log->HitInfo);
6421 data << uint32(log->HitInfo);
6423 //if (log->HitInfo & SPELL_HIT_TYPE_CRIT_DEBUG)
6424 //{
6425 // data << float(log->CritRoll);
6426 // data << float(log->CritNeeded);
6427 //}
6428 //if (log->HitInfo & SPELL_HIT_TYPE_HIT_DEBUG)
6429 //{
6430 // data << float(log->HitRoll);
6431 // data << float(log->HitNeeded);
6432 //}
6433 //if (log->HitInfo & SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG)
6434 //{
6435 // data << float(log->MissChance);
6436 // data << float(log->DodgeChance);
6437 // data << float(log->ParryChance);
6438 // data << float(log->BlockChance);
6439 // data << float(log->GlanceChance);
6440 // data << float(log->CrushChance);
6441 //}
6442 SendMessageToSet(&data, true);
6443}
@ SPELL_HIT_TYPE_HIT_DEBUG
Definition SharedDefines.h:1537
@ SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG
Definition SharedDefines.h:1540
@ SPELL_HIT_TYPE_CRIT_DEBUG
Definition SharedDefines.h:1535
@ SMSG_SPELLNONMELEEDAMAGELOG
Definition Opcodes.h:622
bool physicalLog
Definition Unit.h:504
bool unused
Definition Unit.h:505

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::attacker, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, WorldObject::SendMessageToSet(), SMSG_SPELLNONMELEEDAMAGELOG, SPELL_HIT_TYPE_ATTACK_TABLE_DEBUG, SPELL_HIT_TYPE_CRIT_DEBUG, SPELL_HIT_TYPE_HIT_DEBUG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by CalcAbsorbResist(), DealDamage(), Spell::DoAllEffectOnTarget(), Spell::EffectEnvironmentalDMG(), spell_sindragosa_s_fury::HandleDummy(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandlePeriodicPowerBurnAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and SendSpellNonMeleeDamageLog().

◆ SendSpellNonMeleeDamageLog() [2/2]

void Unit::SendSpellNonMeleeDamageLog ( Unit target,
SpellInfo const *  spellInfo,
uint32  Damage,
SpellSchoolMask  damageSchoolMask,
uint32  AbsorbedDamage,
uint32  Resist,
bool  PhysicalDamage,
uint32  Blocked,
bool  CriticalHit = false,
bool  Split = false 
)
6446{
6447 SpellNonMeleeDamage log(this, target, spellInfo, damageSchoolMask);
6448 log.damage = Damage;
6449 log.absorb = AbsorbedDamage;
6450 log.resist = Resist;
6451 log.physicalLog = PhysicalDamage;
6452 log.blocked = Blocked;
6453 log.HitInfo = 0;
6454 if (CriticalHit)
6455 {
6456 log.HitInfo |= SPELL_HIT_TYPE_CRIT;
6457 }
6458 if (Split)
6459 {
6460 log.HitInfo |= SPELL_HIT_TYPE_SPLIT;
6461 }
6463}
@ SPELL_HIT_TYPE_SPLIT
Definition SharedDefines.h:1538
Definition Unit.h:490

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, SpellNonMeleeDamage::damage, SpellNonMeleeDamage::HitInfo, SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SendSpellNonMeleeDamageLog(), SPELL_HIT_TYPE_CRIT, and SPELL_HIT_TYPE_SPLIT.

◆ SendSpellNonMeleeReflectLog()

void Unit::SendSpellNonMeleeReflectLog ( SpellNonMeleeDamage log,
Unit attacker 
)
6366{
6367 // Xinef: function for players only, placed in unit because of cosmetics
6368 if (!IsPlayer())
6369 return;
6370
6371 WorldPacket data(SMSG_SPELLNONMELEEDAMAGELOG, (16 + 4 + 4 + 4 + 1 + 4 + 4 + 1 + 1 + 4 + 4 + 1)); // we guess size
6372 // If we are in cheat mode we swap absorb with damage and set damage to 0, this way we can still debug damage but our HP bar will not drop
6373 uint32 damage = log->damage;
6374 uint32 absorb = log->absorb;
6375 if (log->target->IsPlayer() && log->target->ToPlayer()->GetCommandStatus(CHEAT_GOD))
6376 {
6377 absorb = damage;
6378 damage = 0;
6379 }
6380 data << log->target->GetPackGUID();
6381 data << attacker->GetPackGUID();
6382 data << uint32(log->spellInfo->Id);
6383 data << uint32(damage); // damage amount
6384 int32 overkill = damage - log->target->GetHealth();
6385 data << uint32(overkill > 0 ? overkill : 0); // overkill
6386 data << uint8 (log->schoolMask); // damage school
6387 data << uint32(absorb); // AbsorbedDamage
6388 data << uint32(log->resist); // resist
6389 data << uint8 (log->physicalLog); // if 1, then client show spell name (example: %s's ranged shot hit %s for %u school or %s suffers %u school damage from %s's spell_name
6390 data << uint8 (log->unused); // unused
6391 data << uint32(log->blocked); // blocked
6392 data << uint32(log->HitInfo);
6393 data << uint8 (0); // flag to use extend data
6394 ToPlayer()->SendDirectMessage(&data);
6395}

References SpellNonMeleeDamage::absorb, SpellNonMeleeDamage::blocked, CHEAT_GOD, SpellNonMeleeDamage::damage, Player::GetCommandStatus(), GetHealth(), Object::GetPackGUID(), SpellNonMeleeDamage::HitInfo, SpellInfo::Id, Object::IsPlayer(), SpellNonMeleeDamage::physicalLog, SpellNonMeleeDamage::resist, SpellNonMeleeDamage::schoolMask, Player::SendDirectMessage(), SMSG_SPELLNONMELEEDAMAGELOG, SpellNonMeleeDamage::spellInfo, SpellNonMeleeDamage::target, Object::ToPlayer(), and SpellNonMeleeDamage::unused.

Referenced by Spell::DoAllEffectOnTarget().

◆ SendTameFailure()

void Unit::SendTameFailure ( uint8  result)
19819{
19821 data << uint8(result);
19822 ToPlayer()->SendDirectMessage(&data);
19823}
@ SMSG_PET_TAME_FAILURE
Definition Opcodes.h:401

References Player::SendDirectMessage(), SMSG_PET_TAME_FAILURE, and Object::ToPlayer().

Referenced by spell_hun_tame_beast::CheckCast(), and Spell::CheckCast().

◆ SendTeleportPacket()

void Unit::SendTeleportPacket ( Position pos)
19826{
19828 if (IsCreature())
19829 Relocate(&pos);
19830 if (IsPlayer())
19831 {
19832 ToPlayer()->SetCanTeleport(true);
19833 }
19834 WorldPacket data2(MSG_MOVE_TELEPORT, 38);
19835 data2 << GetPackGUID();
19836 BuildMovementPacket(&data2);
19837 if (IsCreature())
19838 Relocate(&oldPos);
19839 if (IsPlayer())
19840 Relocate(&pos);
19841 SendMessageToSet(&data2, false);
19842}
@ MSG_MOVE_TELEPORT
Definition Opcodes.h:227

References BuildMovementPacket(), Position::GetOrientation(), Object::GetPackGUID(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsCreature(), Object::IsPlayer(), MSG_MOVE_TELEPORT, Position::Relocate(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), and Object::ToPlayer().

Referenced by NearTeleportTo(), and Player::TeleportTo().

◆ SendThreatListUpdate()

void Unit::SendThreatListUpdate ( )
19898{
19899 if (!GetThreatMgr().isThreatListEmpty())
19900 {
19901 uint32 count = GetThreatMgr().GetThreatList().size();
19902
19903 //LOG_DEBUG("entities.unit", "WORLD: Send SMSG_THREAT_UPDATE Message");
19904 WorldPacket data(SMSG_THREAT_UPDATE, 8 + count * 8);
19905 data << GetPackGUID();
19906 data << uint32(count);
19908 for (ThreatContainer::StorageType::const_iterator itr = tlist.begin(); itr != tlist.end(); ++itr)
19909 {
19910 data << (*itr)->getUnitGuid().WriteAsPacked();
19911 data << uint32((*itr)->GetThreat() * 100);
19912 }
19913 SendMessageToSet(&data, false);
19914 }
19915}
@ SMSG_THREAT_UPDATE
Definition Opcodes.h:1185

References Object::GetPackGUID(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::SendMessageToSet(), and SMSG_THREAT_UPDATE.

Referenced by Update().

◆ SetAI()

void Unit::SetAI ( UnitAI newAI)
inline
649{ i_AI = newAI; }

References i_AI.

◆ SetArmor()

void Unit::SetArmor ( int32  val)
inline

◆ SetAttackTime()

◆ setAttackTimer()

◆ SetAuraStack()

void Unit::SetAuraStack ( uint32  spellId,
Unit target,
uint32  stack 
)
18989{
18990 Aura* aura = target->GetAura(spellId, GetGUID());
18991 if (!aura)
18992 aura = AddAura(spellId, target);
18993 if (aura && stack)
18994 aura->SetStackAmount(stack);
18995}
void SetStackAmount(uint8 num)
Definition SpellAuras.cpp:995

References AddAura(), GetAura(), Object::GetGUID(), and Aura::SetStackAmount().

Referenced by boss_viscidus::DamageTaken(), spell_capacitus_polarity_charge::HandleTargets(), spell_thaddius_pos_neg_charge::HandleTargets(), and BattlefieldWG::OnPlayerJoinWar().

◆ SetBaseWeaponDamage()

void Unit::SetBaseWeaponDamage ( WeaponAttackType  attType,
WeaponDamageRange  damageRange,
float  value,
uint8  damageIndex = 0 
)
inline
1139{ m_weaponDamage[attType][damageRange][damageIndex] = value; }

References m_weaponDamage.

Referenced by Player::_ApplyWeaponDamage(), Guardian::InitStatsForLevel(), and Creature::SelectLevel().

◆ SetCanDualWield()

virtual void Unit::SetCanDualWield ( bool  value)
inlinevirtual

◆ SetCanFly()

bool Unit::SetCanFly ( bool  enable,
bool  packetOnly = false 
)
virtual

Add the movement flag: MOVEMENTFLAGCAN_FLY. Generaly only use by players, allowing them to fly by pressing space for example. For creatures, please look for DisableGravity().

Doesn't inform the client.

Reimplemented in Player, and Creature.

20465{
20467 return false;
20468
20469 if (enable)
20470 {
20473 }
20474 else
20475 {
20477 }
20478
20479 return true;
20480}
@ MOVEMENTFLAG_CAN_FLY
Definition UnitDefines.h:389
@ MOVEMENTFLAG_MASK_MOVING_FLY
Definition UnitDefines.h:406
void AddUnitMovementFlag(uint32 f)
Definition Unit.h:727

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_CAN_FLY, MOVEMENTFLAG_FALLING, MOVEMENTFLAG_MASK_MOVING_FLY, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraAllowFlight(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_chapter5_light_of_dawn_aura::OnApply(), spell_chapter5_light_of_dawn_aura::OnRemove(), Player::SetCanFly(), and Creature::SetCanFly().

◆ SetCanModifyStats()

◆ SetCantProc()

void Unit::SetCantProc ( bool  apply)
17359{
17360 if (apply)
17361 ++m_procDeep;
17362 else
17363 {
17365 --m_procDeep;
17366 }
17367}

References ASSERT, and m_procDeep.

Referenced by HandleDummyAuraProc(), and ProcDamageAndSpellFor().

◆ SetCharm()

void Unit::SetCharm ( Unit target,
bool  apply 
)
Todo:
: maybe we can use this flag to check if controlled by player
10963{
10964 if (apply)
10965 {
10966 if (IsPlayer())
10967 {
10968 if (!AddGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10969 LOG_FATAL("entities.unit", "Player {} is trying to charm unit {}, but it already has a charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10970
10971 charm->m_ControlledByPlayer = true;
10973 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
10974 }
10975 else
10976 charm->m_ControlledByPlayer = false;
10977
10978 // PvP, FFAPvP
10979 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, GetByteValue(UNIT_FIELD_BYTES_2, 1));
10980
10981 if (!charm->AddGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
10982 LOG_FATAL("entities.unit", "Unit {} is being charmed, but it already has a charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
10983
10984 _isWalkingBeforeCharm = charm->IsWalking();
10986 {
10987 charm->SetWalk(false);
10988 charm->SendMovementFlagUpdate();
10989 }
10990
10991 m_Controlled.insert(charm);
10992 }
10993 else
10994 {
10995 if (IsPlayer())
10996 {
10997 if (!RemoveGuidValue(UNIT_FIELD_CHARM, charm->GetGUID()))
10998 LOG_FATAL("entities.unit", "Player {} is trying to uncharm unit {}, but it has another charmed unit {}", GetName(), charm->GetEntry(), GetCharmGUID().ToString());
10999 }
11000
11001 if (!charm->RemoveGuidValue(UNIT_FIELD_CHARMEDBY, GetGUID()))
11002 LOG_FATAL("entities.unit", "Unit {} is being uncharmed, but it has another charmer {}", charm->GetEntry(), charm->GetCharmerGUID().ToString());
11003
11004 if (charm->IsPlayer())
11005 {
11006 charm->m_ControlledByPlayer = true;
11007 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11008 charm->ToPlayer()->UpdatePvPState();
11009 }
11010 else if (Player* player = charm->GetCharmerOrOwnerPlayerOrPlayerItself())
11011 {
11012 charm->m_ControlledByPlayer = true;
11013 charm->SetUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11014 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, player->GetByteValue(UNIT_FIELD_BYTES_2, 1));
11015
11016 // Xinef: skip controlled erase if charmed unit is owned by charmer
11017 if (charm->IsInWorld() && !charm->IsDuringRemoveFromWorld() && player->GetGUID() == this->GetGUID() && (charm->IsPet() || charm->HasUnitTypeMask(UNIT_MASK_MINION)))
11018 return;
11019 }
11020 else
11021 {
11022 charm->m_ControlledByPlayer = false;
11023 charm->RemoveUnitFlag(UNIT_FLAG_PLAYER_CONTROLLED);
11024 charm->SetByteValue(UNIT_FIELD_BYTES_2, 1, 0);
11025 }
11026
11027 if (charm->IsWalking() != _isWalkingBeforeCharm)
11028 {
11029 charm->SetWalk(_isWalkingBeforeCharm);
11030 charm->SendMovementFlagUpdate(true); // send packet to self, to update movement state on player.
11031 }
11032
11033 m_Controlled.erase(charm);
11034 }
11035}
bool AddGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:686
bool RemoveGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:704

References _isWalkingBeforeCharm, Object::AddGuidValue(), Object::GetByteValue(), GetCharmerGUID(), GetCharmerOrOwnerPlayerOrPlayerItself(), GetCharmGUID(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), WorldObject::GetName(), HasUnitTypeMask(), IsDuringRemoveFromWorld(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), IsWalking(), LOG_FATAL, m_Controlled, m_ControlledByPlayer, Object::RemoveGuidValue(), RemoveUnitFlag(), SendMovementFlagUpdate(), Object::SetByteValue(), SetUnitFlag(), SetWalk(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), UNIT_FIELD_BYTES_2, UNIT_FIELD_CHARM, UNIT_FIELD_CHARMEDBY, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_MASK_MINION, and Player::UpdatePvPState().

Referenced by RemoveCharmedBy(), SetCharmedBy(), and Player::StopCastingCharm().

◆ SetCharmedBy()

bool Unit::SetCharmedBy ( Unit charmer,
CharmType  type,
AuraApplication const *  aurApp = nullptr 
)
18437{
18438 if (!charmer)
18439 return false;
18440
18441 if (!charmer->IsInWorld() || charmer->IsDuringRemoveFromWorld())
18442 {
18443 return false;
18444 }
18445
18446 // dismount players when charmed
18447 if (IsPlayer())
18449
18450 if (charmer->IsPlayer())
18452
18453 ASSERT(type != CHARM_TYPE_POSSESS || charmer->IsPlayer());
18454 if (type == CHARM_TYPE_VEHICLE && !IsVehicle()) // pussywizard
18455 throw 1;
18456 ASSERT((type == CHARM_TYPE_VEHICLE) == IsVehicle());
18457
18458 LOG_DEBUG("entities.unit", "SetCharmedBy: charmer {} ({}), charmed {} ({}), type {}.",
18459 charmer->GetEntry(), charmer->GetGUID().ToString(), GetEntry(), GetGUID().ToString(), uint32(type));
18460
18461 if (this == charmer)
18462 {
18463 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Unit {} ({}) is trying to charm itself!", GetEntry(), GetGUID().ToString());
18464 return false;
18465 }
18466
18467 //if (HasUnitState(UNIT_STATE_UNATTACKABLE))
18468 // return false;
18469
18470 if (IsPlayer() && ToPlayer()->GetTransport())
18471 {
18472 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: Player on transport is trying to charm {} ({})", GetEntry(), GetGUID().ToString());
18473 return false;
18474 }
18475
18476 // Already charmed
18477 if (GetCharmerGUID())
18478 {
18479 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) has already been charmed but {} ({}) is trying to charm it!",
18480 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18481 return false;
18482 }
18483
18484 CastStop();
18485 AttackStop();
18486
18487 // Xinef: dont reset threat and combat, put them on offline list, moved down after faction changes
18488 // CombatStop(); /// @todo: CombatStop(true) may cause crash (interrupt spells)
18489 // DeleteThreatList();
18490
18491 Player* playerCharmer = charmer->ToPlayer();
18492
18493 // Charmer stop charming
18494 if (playerCharmer)
18495 {
18496 playerCharmer->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18497 playerCharmer->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18498 }
18499
18500 // Charmed stop charming
18501 if (IsPlayer())
18502 {
18503 ToPlayer()->StopCastingCharm(aurApp ? aurApp->GetBase() : nullptr);
18504 ToPlayer()->StopCastingBindSight(aurApp ? aurApp->GetBase() : nullptr);
18505 }
18506
18507 // StopCastingCharm may remove a possessed pet?
18508 if (!IsInWorld())
18509 {
18510 LOG_FATAL("entities.unit", "Unit::SetCharmedBy: {} ({}) is not in world but {} ({}) is trying to charm it!",
18511 GetEntry(), GetGUID().ToString(), charmer->GetEntry(), charmer->GetGUID().ToString());
18512 return false;
18513 }
18514
18515 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18516 // prevent undefined behaviour
18517 if (aurApp && aurApp->GetRemoveMode())
18518 return false;
18519
18521 SetFaction(charmer->GetFaction());
18522
18523 // Set charmed
18524 charmer->SetCharm(this, true);
18525
18527
18528 if (IsCreature())
18529 {
18530 GetMotionMaster()->Clear(false);
18532 StopMoving();
18533
18534 if (charmer->IsPlayer() && charmer->IsClass(CLASS_WARLOCK, CLASS_CONTEXT_PET_CHARM) && ToCreature()->GetCreatureTemplate()->type == CREATURE_TYPE_DEMON)
18535 {
18536 // Disable CreatureAI/SmartAI and switch to CharmAI when charmed by warlock
18537 Creature* charmed = ToCreature();
18538 charmed->NeedChangeAI = true;
18539 charmed->IsAIEnabled = false;
18540 }
18541 else
18542 {
18543 ToCreature()->AI()->OnCharmed(true);
18544 }
18545
18546 // Xinef: If creature can fly, add normal player flying flag (fixes speed)
18547 if (charmer->IsPlayer() && ToCreature()->CanFly())
18549 }
18550 else
18551 {
18552 Player* player = ToPlayer();
18553 if (player->isAFK())
18554 player->ToggleAFK();
18555
18556 player->SetClientControl(this, false); // verified
18557 }
18558
18559 // charm is set by aura, and aura effect remove handler was called during apply handler execution
18560 // prevent undefined behaviour
18561 if (aurApp && aurApp->GetRemoveMode())
18562 return false;
18563
18564 // Pets already have a properly initialized CharmInfo, don't overwrite it.
18565 // Xinef: I need charmInfo for vehicle
18566 if (/*type != CHARM_TYPE_VEHICLE &&*/ !GetCharmInfo())
18567 {
18568 InitCharmInfo();
18569 if (type == CHARM_TYPE_POSSESS)
18571 else if (type != CHARM_TYPE_VEHICLE)
18572 {
18574
18575 // Xinef: convert charm npcs dont have pet bar so initialize them as defensive helpers
18576 if (type == CHARM_TYPE_CONVERT && IsCreature())
18578 }
18579 }
18580
18581 if (playerCharmer)
18582 {
18583 switch (type)
18584 {
18585 case CHARM_TYPE_VEHICLE:
18588 playerCharmer->SetClientControl(this, true); // verified
18589 playerCharmer->VehicleSpellInitialize();
18590 break;
18591 case CHARM_TYPE_POSSESS:
18596 playerCharmer->SetClientControl(this, true); // verified
18597 playerCharmer->PossessSpellInitialize();
18598 break;
18599 case CHARM_TYPE_CHARM:
18601 {
18603 if (cinfo && cinfo->type == CREATURE_TYPE_DEMON)
18604 {
18605 // to prevent client crash
18607
18608 // just to enable stat window
18609 if (GetCharmInfo())
18610 GetCharmInfo()->SetPetNumber(sObjectMgr->GeneratePetNumber(), true);
18611
18612 // if charmed two demons the same session, the 2nd gets the 1st one's name
18613 SetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP, uint32(GameTime::GetGameTime().count())); // cast can't be helped
18614 }
18615 }
18616 if (playerCharmer->m_seer != this)
18617 {
18619 playerCharmer->CharmSpellInitialize();
18620 }
18621 break;
18622 default:
18623 break;
18624 }
18625 }
18626 else if (IsPlayer())
18628
18629 if (Creature* creature = ToCreature())
18630 creature->RefreshSwimmingFlag();
18631
18632 if (IsPlayer())
18633 sScriptMgr->OnPlayerBeingCharmed(ToPlayer(), charmer, _oldFactionId, charmer->GetFaction());
18634
18635 return true;
18636}
@ CHARM_TYPE_CONVERT
Definition CharmInfo.h:48
@ REACT_DEFENSIVE
Definition Unit.h:550
@ UNIT_FIELD_PET_NAME_TIMESTAMP
Definition UpdateFields.h:133
void OnCharmed(bool apply) override
Called when unit is charmed.
Definition CreatureAI.cpp:35
void SetReactState(ReactStates state)
A creature can have 3 ReactStates : Agressive, Passive, Neutral.
Definition Creature.h:95
void MoveIdle()
Definition MotionMaster.cpp:232
void CharmSpellInitialize()
Definition Player.cpp:9674
WorldObject * m_seer
Definition Player.h:2349
void ToggleAFK()
Definition Player.cpp:1299
void PossessSpellInitialize()
Definition Player.cpp:9571
bool isAFK() const
Definition Player.h:1153
void VehicleSpellInitialize()
Definition Player.cpp:9599
void StopCastingBindSight(Aura *except=nullptr)
Definition Player.cpp:13130
virtual float GetFollowAngle() const
Definition Unit.h:1809
CharmInfo * InitCharmInfo()
Definition Unit.cpp:15887
void InitPossessCreateSpells()
Definition CharmInfo.cpp:77
void InitCharmCreateSpells()
Definition CharmInfo.cpp:98

References _oldFactionId, AddUnitMovementFlag(), AddUnitState(), Creature::AI(), ASSERT, AttackStop(), CanFly(), CastStop(), CHARM_TYPE_CHARM, CHARM_TYPE_CONVERT, CHARM_TYPE_POSSESS, CHARM_TYPE_VEHICLE, Player::CharmSpellInitialize(), CLASS_CONTEXT_PET_CHARM, CLASS_MAGE, CLASS_WARLOCK, MotionMaster::Clear(), CREATURE_TYPE_DEMON, AuraApplication::GetBase(), GetCharmerGUID(), GetCharmInfo(), Creature::GetCreatureTemplate(), Object::GetEntry(), GetFaction(), GetFollowAngle(), GameTime::GetGameTime(), Object::GetGUID(), Object::GetGUID(), GetMotionMaster(), AuraApplication::GetRemoveMode(), WorldObject::GetTransport(), CharmInfo::InitCharmCreateSpells(), InitCharmInfo(), CharmInfo::InitPossessCreateSpells(), Player::isAFK(), IsAIEnabled, IsClass(), Object::IsCreature(), IsDuringRemoveFromWorld(), Object::IsInWorld(), Object::IsPlayer(), IsVehicle(), LOG_DEBUG, LOG_FATAL, Player::m_seer, MotionMaster::MoveFollow(), MotionMaster::MoveIdle(), MOVEMENTFLAG_FLYING, NeedChangeAI, CreatureAI::OnCharmed(), PET_FOLLOW_DIST, Player::PossessSpellInitialize(), REACT_DEFENSIVE, RemoveAurasByType(), Object::SetByteValue(), SetCharm(), Player::SetClientControl(), SetFaction(), CharmInfo::SetPetNumber(), Creature::SetReactState(), SetUInt32Value(), SetUnitFlag(), sObjectMgr, SPELL_AURA_MOD_SHAPESHIFT, SPELL_AURA_MOUNTED, sScriptMgr, StopAttackingInvalidTarget(), Player::StopCastingBindSight(), Player::StopCastingCharm(), StopMoving(), Object::ToCreature(), Player::ToggleAFK(), Object::ToPlayer(), ObjectGuid::ToString(), Position::ToString(), CreatureTemplate::type, UNIT_FIELD_BYTES_0, UNIT_FIELD_PET_NAME_TIMESTAMP, UNIT_FLAG_DISABLE_MOVE, UNIT_FLAG_POSSESSED, UNIT_STATE_NO_ENVIRONMENT_UPD, UNIT_STATE_POSSESSED, and Player::VehicleSpellInitialize().

Referenced by Vehicle::AddPassenger(), AuraEffect::HandleCharmConvert(), AuraEffect::HandleModCharm(), AuraEffect::HandleModPossess(), AuraEffect::HandleModPossessPet(), and Puppet::InitSummon().

◆ SetCharmerGUID()

void Unit::SetCharmerGUID ( ObjectGuid  owner)
inline

◆ SetCombatTimer()

void Unit::SetCombatTimer ( uint32  timer)
inline
890{ m_CombatTimer = timer; }

References m_CombatTimer.

◆ SetConfused()

void Unit::SetConfused ( bool  apply)
protected
18405{
18406 if (apply)
18407 {
18408 SetTarget();
18410 }
18411 else
18412 {
18413 if (IsAlive())
18414 {
18415 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == CONFUSED_MOTION_TYPE)
18416 {
18418 StopMoving();
18419 }
18420
18421 if (GetVictim())
18423 }
18424 }
18425
18426 // xinef: block / allow control to real mover (eg. charmer)
18427 if (IsPlayer())
18428 {
18429 if (m_movedByPlayer)
18430 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18431 //else
18432 // ToPlayer()->SetClientControl(this, !apply);
18433 }
18434}
@ CONFUSED_MOTION_TYPE
Definition MotionMaster.h:44
void MoveConfused()
Enable the confusion movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:292

References CONFUSED_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveConfused(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), and Object::ToPlayer().

Referenced by SetControlled().

◆ SetContestedPvP()

void Unit::SetContestedPvP ( Player attackedPlayer = nullptr,
bool  lookForNearContestedGuards = true 
)
17321{
17323
17324 if (!player || ((attackedPlayer && (attackedPlayer == player || (player->duel && player->duel->Opponent == attackedPlayer))) || player->InBattleground()))
17325 return;
17326
17327 // check if there any guards that should care about the contested flag on player
17328 if (lookForNearContestedGuards)
17329 {
17330 std::list<Unit*> targets;
17333 Cell::VisitAllObjects(this, searcher, MAX_AGGRO_RADIUS);
17334
17335 // return if there are no contested guards found
17336 if (!targets.size())
17337 {
17338 return;
17339 }
17340 }
17341
17342 player->SetContestedPvPTimer(30000);
17344 {
17347 // call MoveInLineOfSight for nearby contested guards
17349 }
17351 {
17353 // call MoveInLineOfSight for nearby contested guards
17355 }
17356}
#define MAX_AGGRO_RADIUS
Definition Unit.h:44
void SetPlayerFlag(PlayerFlags flags)
Definition Player.h:1128
bool InBattleground() const
Definition Player.h:2267
void SetContestedPvPTimer(uint32 newTime)
Definition Player.h:1882

References WorldObject::AddToNotify(), AddUnitState(), Player::duel, GetCharmerOrOwnerPlayerOrPlayerItself(), HasUnitState(), Player::InBattleground(), MAX_AGGRO_RADIUS, NOTIFY_AI_RELOCATION, PLAYER_FLAGS_CONTESTED_PVP, Player::SetContestedPvPTimer(), Player::SetPlayerFlag(), UNIT_STATE_ATTACK_PLAYER, and Cell::VisitAllObjects().

Referenced by CombatStart(), CombatStartOnCast(), Spell::DoSpellHitOnUnit(), and WorldSession::HandlePlayerLoginFromDB().

◆ SetControlled()

void Unit::SetControlled ( bool  apply,
UnitState  state,
Unit source = nullptr,
bool  isFear = false 
)
18121{
18122 if (apply)
18123 {
18124 if (HasUnitState(state))
18125 return;
18126
18127 AddUnitState(state);
18128 switch (state)
18129 {
18130 case UNIT_STATE_STUNNED:
18131 SetStunned(true);
18132 break;
18133 case UNIT_STATE_ROOT:
18135 SetRooted(true);
18136 break;
18139 {
18142 // SendAutoRepeatCancel ?
18143 SetConfused(true);
18144 CastStop(0, false);
18145 }
18146 break;
18147 case UNIT_STATE_FLEEING:
18149 {
18152 // SendAutoRepeatCancel ?
18153 SetFeared(true, source, isFear);
18154 CastStop(0, false);
18155 }
18156 break;
18157 default:
18158 break;
18159 }
18160
18161 if (IsPlayer())
18162 {
18163 sScriptMgr->AnticheatSetRootACKUpd(ToPlayer());
18164 }
18165 }
18166 else
18167 {
18168 // xinef: moved from below, checked all SetX functions, no calls to currently modified state
18169 // xinef: added to each case because of return
18170 //ClearUnitState(state);
18171
18172 switch (state)
18173 {
18174 case UNIT_STATE_STUNNED:
18175 if (HasStunAura())
18176 return;
18177 ClearUnitState(state);
18178 SetStunned(false);
18179 break;
18180 case UNIT_STATE_ROOT:
18181 // Prevent creature_template_movement rooted flag from being removed on aura expiration.
18182 if (IsCreature())
18183 {
18184 if (ToCreature()->GetCreatureTemplate()->Movement.Rooted)
18185 {
18186 return;
18187 }
18188 }
18189
18190 if (HasRootAura() || GetVehicle())
18191 return;
18192 ClearUnitState(state);
18193 SetRooted(false);
18194 break;
18196 if (HasConfuseAura())
18197 return;
18198 ClearUnitState(state);
18199 SetConfused(false);
18200 break;
18201 case UNIT_STATE_FLEEING:
18202 if (HasFearAura())
18203 return;
18204 ClearUnitState(state);
18205 SetFeared(false);
18206 break;
18207 default:
18208 return;
18209 }
18210
18211 //ClearUnitState(state);
18212
18214 SetStunned(true);
18215 else
18216 {
18218 SetRooted(true);
18219
18221 SetConfused(true);
18223 {
18224 bool isFear = false;
18225 if (HasFearAura())
18226 {
18227 isFear = true;
18228 source = ObjectAccessor::GetUnit(*this, GetAuraEffectsByType(SPELL_AURA_MOD_FEAR).front()->GetCasterGUID());
18229 }
18230
18231 if (!source)
18232 {
18233 source = getAttackerForHelper();
18234 }
18235
18236 SetFeared(true, source, isFear);
18237 }
18238 }
18239 }
18240}
void SetFeared(bool apply, Unit *fearedBy=nullptr, bool isFear=false)
Definition Unit.cpp:18372
bool HasStunAura() const
Definition Unit.h:1753
void SetConfused(bool apply)
Definition Unit.cpp:18404
void SetStunned(bool apply)
Definition Unit.cpp:18242
Unit * getAttackerForHelper() const
Definition Unit.cpp:754
bool HasConfuseAura() const
Definition Unit.h:1751
void SetRooted(bool apply, bool isStun=false)
Definition Unit.cpp:18290
bool HasRootAura() const
Definition Unit.h:1752
bool HasFearAura() const
Definition Unit.h:1750
Definition Unit.h:258

References AddUnitState(), CastStop(), ClearUnitState(), getAttackerForHelper(), GetAuraEffectsByType(), ObjectAccessor::GetUnit(), GetVehicle(), HasConfuseAura(), HasFearAura(), HasRootAura(), HasStunAura(), HasUnitState(), Object::IsCreature(), Object::IsPlayer(), SendMeleeAttackStop(), SetConfused(), SetFeared(), SetRooted(), SetStunned(), SPELL_AURA_MOD_FEAR, sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_STATE_CONFUSED, UNIT_STATE_FLEEING, UNIT_STATE_MELEE_ATTACKING, UNIT_STATE_ROOT, and UNIT_STATE_STUNNED.

Referenced by _ExitVehicle(), Vehicle::AddPassenger(), boss_ahune::boss_ahune(), boss_ouro::boss_ouro(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_palehoof::boss_palehoofAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_akama_illidan::DoAction(), Creature::DoFleeToGetAssistance(), boss_skeram::DoTeleport(), CritterAI::EnterEvadeMode(), boss_devourer_of_souls::boss_devourer_of_soulsAI::EnterEvadeMode(), boss_falric::boss_falricAI::EnterEvadeMode(), boss_garfrost::boss_garfrostAI::EnterEvadeMode(), boss_rotface::boss_rotfaceAI::EnterEvadeMode(), boss_noth::boss_nothAI::EnterEvadeMode(), boss_thaddius_summon::boss_thaddius_summonAI::EnterEvadeMode(), boss_urom::boss_uromAI::EnterEvadeMode(), boss_varos::boss_varosAI::EnterEvadeMode(), boss_ignis::boss_ignisAI::EnterEvadeMode(), boss_razorscale::boss_razorscaleAI::EnterEvadeMode(), boss_ingvar_the_plunderer::EnterEvadeMode(), boss_svala::boss_svalaAI::EnterEvadeMode(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_shirrak_the_dead_watcher::EnterEvadeMode(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleAuraModRoot(), AuraEffect::HandleAuraModStun(), debug_commandscript::HandleDebugMoveflagsCommand(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_mc_play_dead_aura::HandleEffectApply(), spell_gen_visual_dummy_stun::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_mc_play_dead_aura::HandleEffectRemove(), spell_gen_visual_dummy_stun::HandleEffectRemove(), AuraEffect::HandleModConfuse(), AuraEffect::HandleModFear(), AuraEffect::HandlePreventFleeing(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleRemove(), boss_volazj::JustDied(), CritterAI::JustEngagedWith(), boss_skadi::boss_skadiAI::JustEngagedWith(), boss_shirrak_the_dead_watcher::JustEngagedWith(), boss_skeram::JustSummoned(), npc_twilight_volunteer::MovementInform(), boss_garfrost::boss_garfrostAI::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), boss_illidan_stormrage::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), npc_gunship_gunner::npc_gunship_gunnerAI::MovementInform(), npc_gunship_rocketeer::npc_gunship_rocketeerAI::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_iron_watcher::npc_iron_watcherAI::MovementInform(), npc_buru_egg::npc_buru_egg(), npc_icc_blood_beast::npc_icc_blood_beastAI::npc_icc_blood_beastAI(), npc_raging_spirit::npc_raging_spiritAI::npc_raging_spiritAI(), npc_vengeful_shade::npc_vengeful_shadeAI::npc_vengeful_shadeAI(), spell_systems_shutdown_aura::OnApply(), spell_systems_shutdown_aura::OnRemove(), npc_akama_illidan::PathEndReached(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_skeram::Reset(), boss_volazj::Reset(), npc_twilight_summon::npc_twilight_summonAI::Reset(), boss_devourer_of_souls::boss_devourer_of_soulsAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_garfrost::boss_garfrostAI::Reset(), boss_noth::boss_nothAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_thaddius_summon::boss_thaddius_summonAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_ignis::boss_ignisAI::Reset(), boss_thorim_pillar::boss_thorim_pillarAI::Reset(), boss_xt002::boss_xt002AI::Reset(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::Reset(), boss_ingvar_the_plunderer::Reset(), boss_palehoof::boss_palehoofAI::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::Reset(), npc_iron_watcher::npc_iron_watcherAI::Reset(), boss_shirrak_the_dead_watcher::Reset(), boss_illidan_stormrage::Reset(), npc_akama_illidan::Reset(), npc_target_dummy::npc_target_dummyAI::Reset(), boss_illidan_stormrage::ScheduleAbilities(), Player::SetClientControl(), boss_urom::boss_uromAI::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_garfrost::boss_garfrostAI::SpellHitTarget(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_volkhan::boss_volkhanAI::SpellHitTarget(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_noth::boss_nothAI::StartGroundPhase(), boss_skeram::UpdateAI(), boss_volazj::UpdateAI(), boss_falric::boss_falricAI::UpdateAI(), npc_icc_blood_beast::npc_icc_blood_beastAI::UpdateAI(), npc_vengeful_shade::npc_vengeful_shadeAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), boss_thaddius::boss_thaddiusAI::UpdateAI(), boss_thaddius_summon::boss_thaddius_summonAI::UpdateAI(), boss_urom::boss_uromAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), boss_loken::boss_lokenAI::UpdateAI(), boss_ignis::boss_ignisAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_yoggsaron_immortal_guardian::boss_yoggsaron_immortal_guardianAI::UpdateAI(), boss_ingvar_the_plunderer::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), boss_palehoof::boss_palehoofAI::UpdateAI(), boss_skadi::boss_skadiAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_cyanigosa::boss_cyanigosaAI::UpdateAI(), npc_tournament_training_dummy::npc_tournament_training_dummyAI::UpdateAI(), npc_target_dummy::npc_target_dummyAI::UpdateAI(), Creature::UpdateEntry(), and npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached().

◆ SetCreateHealth()

◆ SetCreateMana()

◆ SetCreateStat()

void Unit::SetCreateStat ( Stats  stat,
float  val 
)
inline

◆ SetCreatorGUID()

◆ SetCritterGUID()

void Unit::SetCritterGUID ( ObjectGuid  guid)
inline

◆ SetCurrentCastedSpell()

void Unit::SetCurrentCastedSpell ( Spell pSpell)
4005{
4006 ASSERT(pSpell); // nullptr may be never passed here, use InterruptSpell or InterruptNonMeleeSpells
4007
4008 CurrentSpellTypes CSpellType = pSpell->GetCurrentContainer();
4009
4010 if (pSpell == m_currentSpells[CSpellType]) // avoid breaking self
4011 return;
4012
4013 bool bySelf = m_currentSpells[CSpellType] && m_currentSpells[CSpellType]->m_spellInfo->Id == pSpell->m_spellInfo->Id;
4014
4015 // break same type spell if it is not delayed
4016 InterruptSpell(CSpellType, false, true, bySelf);
4017
4018 // special breakage effects:
4019 switch (CSpellType)
4020 {
4022 {
4023 // generic spells always break channeled not delayed spells
4025 {
4026 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4027 {
4029 }
4030 }
4031
4032 // autorepeat breaking
4034 {
4035 // break autorepeat if not Auto Shot
4036 if (m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4038 m_AutoRepeatFirstCast = true;
4039 }
4040
4041 // melee spells breaking
4043 {
4044 // break melee spells if cast time
4045 if (pSpell->GetCastTime() > 0)
4046 {
4048 }
4049 }
4050 if (pSpell->GetCastTime() > 0)
4052
4053 break;
4054 }
4056 {
4057 // channel spells always break generic non-delayed and any channeled spells
4059 InterruptSpell(CURRENT_CHANNELED_SPELL, true, true, bySelf);
4060
4061 // it also does break autorepeat if not Auto Shot
4063 m_currentSpells[CURRENT_AUTOREPEAT_SPELL]->m_spellInfo->Id != 75)
4066
4067 break;
4068 }
4070 {
4071 // only Auto Shoot does not break anything
4072 if (pSpell->m_spellInfo->Id != 75)
4073 {
4074 // generic autorepeats break generic non-delayed and channeled non-delayed spells
4076 {
4077 if (!s->GetSpellInfo()->IsActionAllowedChannel())
4078 {
4080 }
4081 }
4082
4084 }
4085 // special action: set first cast flag
4086 m_AutoRepeatFirstCast = true;
4087
4088 break;
4089 }
4090
4091 default:
4092 // other spell types don't break anything now
4093 break;
4094 }
4095
4096 // current spell (if it is still here) may be safely deleted now
4097 if (m_currentSpells[CSpellType])
4098 m_currentSpells[CSpellType]->SetReferencedFromCurrent(false);
4099
4100 // set new current spell
4101 m_currentSpells[CSpellType] = pSpell;
4102 pSpell->SetReferencedFromCurrent(true);
4103
4104 pSpell->m_selfContainer = &(m_currentSpells[pSpell->GetCurrentContainer()]);
4105}
CurrentSpellTypes GetCurrentContainer() const
Definition Spell.cpp:7950
Spell ** m_selfContainer
Definition Spell.h:614

References AddUnitState(), ASSERT, CURRENT_AUTOREPEAT_SPELL, CURRENT_CHANNELED_SPELL, CURRENT_GENERIC_SPELL, CURRENT_MELEE_SPELL, Spell::GetCastTime(), Spell::GetCurrentContainer(), GetCurrentSpell(), SpellInfo::Id, InterruptSpell(), m_AutoRepeatFirstCast, m_currentSpells, Spell::m_selfContainer, Spell::m_spellInfo, Spell::SetReferencedFromCurrent(), and UNIT_STATE_CASTING.

Referenced by Spell::prepare().

◆ setDeathState()

void Unit::setDeathState ( DeathState  s,
bool  despawn = false 
)
virtual

Reimplemented in Creature, Minion, Pet, and Player.

14644{
14645 // death state needs to be updated before RemoveAllAurasOnDeath() calls HandleChannelDeathItem(..) so that
14646 // it can be used to check creation of death items (such as soul shards).
14647 m_deathState = s;
14648
14650 {
14651 CombatStop();
14654 ClearComboPointHolders(); // any combo points pointed to unit lost at it death
14655
14656 if (IsNonMeleeSpellCast(false))
14658
14659 UnsummonAllTotems(true);
14660 RemoveAllControlled(true);
14662 }
14663
14664 if (s == DeathState::JustDied)
14665 {
14666 // remove aurastates allowing special moves
14669
14670 GetMotionMaster()->Clear(false);
14672
14673 // Xinef: Remove Hover so the corpse can fall to the ground
14674 SetHover(false);
14675
14676 if (despawn)
14677 DisableSpline();
14678 else
14679 StopMoving();
14680
14681 // without this when removing IncreaseMaxHealth aura player may stuck with 1 hp
14682 // do not why since in IncreaseMaxHealth currenthealth is checked
14683 SetHealth(0);
14684 SetPower(getPowerType(), 0);
14685
14686 // Stop emote on death
14688
14689 // players in instance don't have ZoneScript, but they have InstanceScript
14691 zoneScript->OnUnitDeath(this);
14692 }
14693 else if (s == DeathState::JustRespawned)
14694 {
14695 RemoveFlag (UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE); // clear skinnable for creature and player (at battleground)
14696 }
14697}
@ UNIT_FLAG_SKINNABLE
Definition UnitDefines.h:276
void ClearAllReactives()
Definition Unit.cpp:16999
virtual bool SetHover(bool enable, bool packetOnly=false, bool updateAnimationTier=true)
Definition Unit.cpp:20530
void ClearDiminishings()
Definition Unit.h:1776
InstanceScript * GetInstanceScript() const
Definition Object.cpp:1185
ZoneScript * GetZoneScript() const
Definition Object.h:593
Definition ZoneScript.h:26

References Alive, MotionMaster::Clear(), ClearAllReactives(), ThreatMgr::ClearAllThreat(), ClearComboPointHolders(), ClearDiminishings(), CombatStop(), HostileRefMgr::deleteReferences(), DisableSpline(), getHostileRefMgr(), WorldObject::GetInstanceScript(), GetMotionMaster(), getPowerType(), GetThreatMgr(), WorldObject::GetZoneScript(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), JustDied, JustRespawned, m_deathState, MotionMaster::MoveIdle(), RemoveAllAurasOnDeath(), RemoveAllControlled(), Object::RemoveFlag(), SetHealth(), SetHover(), SetPower(), SetUInt32Value(), StopMoving(), UNIT_FIELD_FLAGS, UNIT_FLAG_SKINNABLE, UNIT_NPC_EMOTESTATE, and UnsummonAllTotems().

Referenced by _ExitVehicle(), KillMagnetEvent::Execute(), Spell::finish(), WorldSession::HandlePetActionHelper(), AuraEffect::HandleSpiritOfRedemption(), Kill(), Creature::setDeathState(), and Player::setDeathState().

◆ SetDisableGravity()

◆ SetDisplayId()

◆ SetEmoteState()

void Unit::SetEmoteState ( Emote  emoteState)
inline

◆ SetExtraUnitMovementFlags()

void Unit::SetExtraUnitMovementFlags ( uint16  f)
inline

◆ SetFacingTo()

void Unit::SetFacingTo ( float  ori)
20367{
20368 Movement::MoveSplineInit init(this);
20369 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ(), false);
20371 init.DisableTransportPathTransformations(); // It makes no sense to target global orientation
20372 init.SetFacing(ori);
20373 init.Launch();
20374}
ObjectGuid GetTransGUID() const override
Definition Unit.cpp:18842

References Movement::MoveSplineInit::DisableTransportPathTransformations(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetTransGUID(), HasUnitMovementFlag(), Movement::MoveSplineInit::Launch(), MOVEMENTFLAG_ONTRANSPORT, Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_twinemperorsAI::DoAction(), npc_arthas::npc_arthasAI::DoAction(), Spell::EffectDistract(), ResetToHomeOrientation::Execute(), UtherBatteredHiltEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), DistractMovementGenerator::Finalize(), Creature::FocusTarget(), spell_item_unusual_compass::HandleDummy(), spell_drakkari_colossus_face_me::HandleScriptEffect(), boss_grand_warlock_nethekurse::IntroRP(), npc_hyjal_jaina::hyjalJainaAI::IsSummonedBy(), boss_ragnaros::boss_ragnarosAI::JustDied(), boss_ingvar_the_plunderer::JustSummoned(), boss_nalorakk::MoveInLineOfSight(), boss_algalon_the_observer::boss_algalon_the_observerAI::MovementInform(), npc_brann_bronzebeard_algalon::npc_brann_bronzebeard_algalonAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), boss_onyxia::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_eadric::boss_eadricAI::MovementInform(), boss_paletress::boss_paletressAI::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_pos_deathwhisper_necrolyte::npc_pos_deathwhisper_necrolyteAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), boss_razorscale::boss_razorscaleAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), npc_commander_eligor_dawnbringer::npc_commander_eligor_dawnbringerAI::MovementInform(), boss_illidan_stormrage::MovementInform(), boss_essence_of_suffering::boss_essence_of_sufferingAI::MovementInform(), boss_essence_of_desire::boss_essence_of_desireAI::MovementInform(), boss_lady_vashj::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), boss_saviana_ragefire::boss_saviana_ragefireAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), gunship_npc_AI::MovementInform(), npc_gunship_boarding_addAI::MovementInform(), npc_gunship_mage::npc_gunship_mageAI::MovementInform(), boss_the_lich_king::boss_the_lich_kingAI::MovementInform(), boss_skadi_grauf::boss_skadi_graufAI::MovementInform(), spell_lurker_below_spout::OnPeriodic(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), SmartAI::PausePath(), SmartScript::ProcessAction(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_illidan_stormrage::ScheduleAbilities(), boss_nightbane::ScheduleFly(), Player::SetClientControl(), boss_grand_warlock_nethekurse::SetData(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), npc_chesspiece::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), CreatureAI::TriggerAlert(), RotateMovementGenerator::Update(), boss_rend_blackhand::boss_rend_blackhandAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_medivh_bm::UpdateAI(), boss_onyxia::UpdateAI(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_pos_tyrannus_events::npc_pos_tyrannus_eventsAI::UpdateAI(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::UpdateAI(), boss_the_lich_king::boss_the_lich_kingAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_varos::boss_varosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_warden_mellichar::npc_warden_mellicharAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), npc_general_andorov::UpdateEscortAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), npc_argent_soldier::npc_argent_soldierAI::WaypointReached(), npc_ranger_lilatha::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetFacingToObject()

void Unit::SetFacingToObject ( WorldObject object)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20377{
20378 // never face when already moving
20379 if (!IsStopped())
20380 return;
20381
20383 Movement::MoveSplineInit init(this);
20384 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20385 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20386 init.Launch();
20387}
bool IsStopped() const
Definition Unit.h:1677

References Position::GetAngle(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), and Movement::MoveSplineInit::SetFacing().

Referenced by boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), npc_ranshalla::npc_ranshallaAI::DoChannelTorchSpell(), npc_forest_frog::DoSpawnRandom(), spell_yogg_saron_target_selectors::HandleScript(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::IsSummonedBy(), npc_oculus_drake::npc_oculus_drakeAI::IsSummonedBy(), npc_wintergarde_gryphon::IsSummonedBy(), npc_maiev_illidan::IsSummonedBy(), npc_shadow_of_doom::IsSummonedBy(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_illidan_stormrage::JustSummoned(), npc_drakuru_shackles::npc_drakuru_shacklesAI::LockRageclaw(), npc_acherus_necromancer::npc_acherus_necromancerAI::MovementInform(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::MovementInform(), boss_zuljin::MovementInform(), npc_harrison_jones::MovementInform(), npc_akama_illidan::MovementInform(), npc_hor_lich_king::npc_hor_lich_kingAI::MovementInform(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::MovementInform(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), npc_jungle_punch_target::npc_jungle_punch_targetAI::proceedCwEvent(), SmartScript::ProcessAction(), npc_lake_frog::npc_lake_frogAI::ReceiveEmote(), npc_dancing_flames::npc_dancing_flamesAI::ReceiveEmote(), npc_image_of_medivh::npc_image_of_medivhAI::Reset(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), boss_nightbane::ScheduleFly(), boss_razuvious::boss_razuviousAI::ScheduleInteractWithDeathKnight(), boss_the_lurker_below::SchedulerPhaseOne(), boss_shade_of_aran::SetGUID(), npc_bloodmage_laurith::npc_bloodmage_laurithAI::SetGUID(), npc_harrison_jones::sGossipSelect(), npc_crusade_recruit::npc_crusade_recruitAI::sGossipSelect(), npc_death_knight_initiate::npc_death_knight_initiateAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), npc_magister_aledis::StartFight(), boss_hydross_the_unstable::SummonMovementInform(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), boss_victor_nefarius::boss_victor_nefariusAI::UpdateAI(), boss_majordomo::boss_majordomoAI::UpdateAI(), npc_acherus_necromancer::npc_acherus_necromancerAI::UpdateAI(), npc_gothik_the_harvester::npc_gothik_the_harvesterAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_eastvale_peasent::UpdateAI(), npc_partygoer::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_winterfin_playmate::UpdateAI(), npc_snowfall_glade_playmate::UpdateAI(), npc_the_biggest_tree::UpdateAI(), npc_high_oracle_soo_roo::UpdateAI(), npc_the_etymidian::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_pilgrims_bounty_chair::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_onyxia::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), boss_bronjahm::boss_bronjahmAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_rotface::boss_rotfaceAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), npc_ulduar_vx001::npc_ulduar_vx001AI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_hidden_cultist::npc_hidden_cultistAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI(), npc_ranshalla::npc_ranshallaAI::WaypointReached(), npc_arthas::npc_arthasAI::WaypointReached(), npc_scarlet_miner::npc_scarlet_minerAI::WaypointReached(), and npc_kaya_flathoof::npc_kaya_flathoofAI::WaypointReached().

◆ SetFaction()

void Unit::SetFaction ( uint32  faction)
10118{
10120 if (IsCreature())
10122}
void UpdateMoveInLineOfSightState()
Definition Creature.cpp:2595

References Object::IsCreature(), SetUInt32Value(), Object::ToCreature(), UNIT_FIELD_FACTIONTEMPLATE, and Creature::UpdateMoveInLineOfSightState().

Referenced by npc_hidden_cultist::npc_hidden_cultistAI::AttackPlayer(), GameObject::CastSpell(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::DestroyDoor(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), boss_kalecgos::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), Spell::EffectSummonType(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::EnterEvadeMode(), BattlegroundEY::EventTeamCapturedPoint(), AuraEffect::HandleAuraModFaction(), BattlegroundIC::HandleCapturedNodes(), spell_q12096_q12092_dummy::HandleDummy(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), modify_commandscript::HandleModifyFactionCommand(), npc_commandscript::HandleNpcSetFactionIdCommand(), npc_commandscript::HandleNpcSetFactionTempIdCommand(), spell_mutate_explode_bug::HandleOnHit(), spell_q10612_10613_the_fel_and_the_furious::HandleScriptEffect(), spell_item_draenic_pale_ale::HandleSummon(), npc_cork_gizelton::npc_cork_gizeltonAI::ImmuneFlagSet(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_general_andorov::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), Minion::InitStats(), TempSummon::InitStats(), InitTamedPet(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), npc_enraged_spirit::npc_enraged_spiritAI::JustDied(), FollowerAI::JustRespawned(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_volkhan::boss_volkhanAI::JustSummoned(), boss_balinda::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), Pet::LoadPetFromDB(), boss_twilight_corrupter::MoveInLineOfSight(), npc_akama_shade::MovementInform(), BattlegroundAB::NodeOccupied(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), spell_brewfest_reveler_transform::OnApply(), npc_chesspiece::OnCharmed(), BattlefieldWG::OnCreatureCreate(), instance_blackrock_depths::instance_blackrock_depths_InstanceMapScript::OnCreatureCreate(), instance_nexus::instance_nexus_InstanceMapScript::OnCreatureCreate(), instance_black_temple::instance_black_temple_InstanceMapScript::OnCreatureCreate(), boss_azuregos::OnGossipSelect(), InstanceScript::OnPlayerEnter(), npc_prospector_remtravel::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_lakota_windsong::OnQuestAccept(), npc_paoka_swiftmountain::OnQuestAccept(), npc_engineer_helice::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_maxx_a_million_escort::OnQuestAccept(), npc_kaya_flathoof::OnQuestAccept(), npc_wizzlecrank_shredder::OnQuestAccept(), npc_ame::OnQuestAccept(), npc_ranshalla::OnQuestAccept(), npc_lurgglbr::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_apothecary_hanes::OnQuestAccept(), npc_bessy::OnQuestAccept(), npc_isla_starmane::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::PassengerBoarded(), npc_frosthound::npc_frosthoundAI::PassengerBoarded(), BattlegroundAV::PopulateNode(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), RemoveCharmedBy(), boss_doomrel::boss_doomrelAI::Reset(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_coren_direbrew::Reset(), npc_direbrew_minion::Reset(), npc_aquementas::npc_aquementasAI::Reset(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::Reset(), npc_plucky::npc_pluckyAI::Reset(), boss_grobbulus_poison_cloud::boss_grobbulus_poison_cloudAI::Reset(), brann_bronzebeard::brann_bronzebeardAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), npc_captured_rageclaw::npc_captured_rageclawAI::Reset(), npc_akama_shade::Reset(), npc_aeranas::npc_aeranasAI::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), npc_chicken_cluck::npc_chicken_cluckAI::Reset(), RestoreFaction(), SetCharmedBy(), Player::SetFactionForRace(), Player::SetGameMaster(), npc_captain_saeed::npc_captain_saeedAI::SetGUID(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), BattlegroundIC::SetupBattleground(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::SpawnCreature(), npc_captured_rageclaw::npc_captured_rageclawAI::SpellHit(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::SpellHit(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::SpellHit(), npc_enslaved_netherwing_drake::SpellHit(), npc_belnistrasz::npc_belnistraszAI::sQuestAccept(), npc_professor_phizzlethorpe::npc_professor_phizzlethorpeAI::sQuestAccept(), npc_ranger_lilatha::sQuestAccept(), npc_corporal_keeshan::npc_corporal_keeshanAI::sQuestAccept(), npc_muglash::npc_muglashAI::sQuestAccept(), npc_wounded_blood_elf::npc_wounded_blood_elfAI::sQuestAccept(), FollowerAI::StartFollow(), npc_deathstalker_fearleia::SummonCreatureWithRandomTarget(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), Spell::SummonGuardian(), Player::SummonPet(), WorldObject::SummonTrigger(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), npc_death_knight_initiate::npc_death_knight_initiateAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_aquementas::npc_aquementasAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), npc_sergeant_bly::npc_sergeant_blyAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), npc_magister_aledis::UpdateAI(), npc_lord_gregor_lescovar::npc_lord_gregor_lescovarAI::UpdateAI(), Creature::UpdateEntry(), npc_magwin::npc_magwinAI::UpdateEscortAI(), and npc_tapoke_slim_jahn::npc_tapoke_slim_jahnAI::WaypointReached().

◆ SetFeared()

void Unit::SetFeared ( bool  apply,
Unit fearedBy = nullptr,
bool  isFear = false 
)
protected
18373{
18374 if (apply)
18375 {
18376 SetTarget();
18377 GetMotionMaster()->MoveFleeing(fearedBy, isFear ? 0 : sWorld->getIntConfig(CONFIG_CREATURE_FAMILY_FLEE_DELAY));
18378 }
18379 else
18380 {
18381 if (IsAlive())
18382 {
18383 if (GetMotionMaster()->GetMotionSlotType(MOTION_SLOT_CONTROLLED) == FLEEING_MOTION_TYPE)
18384 {
18386 StopMoving();
18387 }
18388
18389 if (GetVictim())
18391 }
18392 }
18393
18394 // xinef: block / allow control to real mover (eg. charmer)
18395 if (IsPlayer())
18396 {
18397 if (m_movedByPlayer)
18398 m_movedByPlayer->ToPlayer()->SetClientControl(this, !apply); // verified
18399 //else
18400 // ToPlayer()->SetClientControl(this, !apply);
18401 }
18402}
@ FLEEING_MOTION_TYPE
Definition MotionMaster.h:49
@ CONFIG_CREATURE_FAMILY_FLEE_DELAY
Definition WorldConfig.h:234
void MoveFleeing(Unit *enemy, uint32 time=0)
Enable the target's fleeing movement. Doesn't work with UNIT_FLAG_DISABLE_MOVE.
Definition MotionMaster.cpp:746

References CONFIG_CREATURE_FAMILY_FLEE_DELAY, FLEEING_MOTION_TYPE, Object::GetGUID(), GetMotionMaster(), MotionMaster::GetMotionSlotType(), GetVictim(), IsAlive(), Object::IsPlayer(), m_movedByPlayer, MOTION_SLOT_CONTROLLED, MotionMaster::MoveFleeing(), MotionMaster::MovementExpired(), Player::SetClientControl(), SetTarget(), StopMoving(), sWorld, and Object::ToPlayer().

Referenced by SetControlled().

◆ SetFeatherFall()

bool Unit::SetFeatherFall ( bool  enable,
bool  packetOnly = false 
)
virtual

Reimplemented in Player, and Creature.

20509{
20511 return false;
20512
20513 if (enable)
20515 else
20517
20518 return true;
20519}
@ MOVEMENTFLAG_FALLING_SLOW
Definition UnitDefines.h:394

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_FALLING_SLOW, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraFeatherFall(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetFeatherFall(), and Creature::SetFeatherFall().

◆ SetFullHealth()

◆ SetHealth()

void Unit::SetHealth ( uint32  val)
15569{
15571 val = 0;
15572 else if (IsPlayer() && getDeathState() == DeathState::Dead)
15573 val = 1;
15574 else
15575 {
15576 uint32 maxHealth = GetMaxHealth();
15577 if (maxHealth < val)
15578 val = maxHealth;
15579 }
15580
15581 float prevHealthPct = GetHealthPct();
15582
15584
15585 // mobs that are now or were below 30% need to update their speed
15586 if (IsCreature() && !(IsPet() && ToPet()->isControlled() && IsControlledByPlayer()) && (prevHealthPct < 30.0 || HealthBelowPct(30)))
15587 {
15588 UpdateSpeed(MOVE_RUN, false);
15589 }
15590
15591 // group update
15592 if (IsPlayer())
15593 {
15594 Player* player = ToPlayer();
15595 if (player->NeedSendSpectatorData())
15597
15598 if (player->GetGroup())
15600 }
15601 else if (Pet* pet = ToCreature()->ToPet())
15602 {
15603 if (pet->isControlled())
15604 {
15605 if (Unit* owner = GetOwner())
15606 if (Player* player = owner->ToPlayer())
15607 {
15608 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15609 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15610
15611 if (player->GetGroup())
15613 }
15614 }
15615 }
15616}
@ GROUP_UPDATE_FLAG_CUR_HP
Definition Group.h:101
@ GROUP_UPDATE_FLAG_PET_CUR_HP
Definition Group.h:113
bool NeedSendSpectatorData() const
Definition Player.cpp:15376
void SetGroupUpdateFlag(uint32 flag)
Definition Player.h:2489
float GetHealthPct() const
Definition Unit.h:1033
void SendCommand_UInt32Value(T *o, ObjectGuid targetGUID, const char *prefix, uint32 t)
Definition ArenaSpectator.h:62

References Dead, WorldObject::FindMap(), getDeathState(), Player::GetGroup(), Object::GetGUID(), GetHealthPct(), GetMaxHealth(), GetOwner(), GROUP_UPDATE_FLAG_CUR_HP, GROUP_UPDATE_FLAG_PET_CUR_HP, HealthBelowPct(), IsControlledByPlayer(), Object::IsCreature(), IsPet(), Object::IsPlayer(), JustDied, MOVE_RUN, Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_HEALTH, and UpdateSpeed().

Referenced by boss_twilight_halion::boss_twilight_halionAI::boss_twilight_halionAI(), Player::BuildPlayerRepop(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_alar::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_viscidus::DamageTaken(), boss_thorim_start_npcs::boss_thorim_start_npcsAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DamageTaken(), DealDamage(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_terenas_menethil::npc_terenas_menethilAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_thaddius_summon::boss_thaddius_summonAI::DoAction(), boss_xt002::boss_xt002AI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), Spell::EffectResurrectPet(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Spell::EffectSummonType(), boss_prince_keleseth_icc::boss_prince_kelesethAI::EnterEvadeMode(), boss_prince_taldaram_icc::boss_prince_taldaramAI::EnterEvadeMode(), boss_prince_valanar_icc::boss_prince_valanarAI::EnterEvadeMode(), AuraEffect::HandleAuraModIncreaseHealth(), AuraEffect::HandleAuraModIncreaseHealthPercent(), AuraEffect::HandleAuraModIncreaseMaxHealth(), spell_oculus_soar_aura::HandleEffectPeriodic(), modify_commandscript::HandleModifyHPCommand(), AuraEffect::HandleModTotalPercentStat(), npc_commandscript::HandleNpcSetLevelCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), npc_echo_of_medivh::HandlePieceJustDied(), spell_stinky_precious_decimate::HandleScript(), spell_ahune_synch_health::HandleScript(), AuraEffect::HandleSpiritOfRedemption(), npc_pet_pri_lightwell::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustReachedHome(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustReachedHome(), boss_prince_valanar_icc::boss_prince_valanarAI::JustReachedHome(), npc_dirt_mound::JustSummoned(), boss_skeram::JustSummoned(), boss_attumen::JustSummoned(), boss_baltharus_the_warborn::boss_baltharus_the_warbornAI::JustSummoned(), boss_drakkari_colossus::boss_drakkari_colossusAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyHealth(), boss_grand_champion::boss_grand_championAI::MovementInform(), npc_nether_drake::npc_nether_drakeAI::MovementInform(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), instance_karazhan::instance_karazhan_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), Player::ProcessDelayedOperations(), boss_vaelastrasz::boss_vaelAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), boss_prince_keleseth_icc::boss_prince_kelesethAI::Reset(), boss_prince_taldaram_icc::boss_prince_taldaramAI::Reset(), boss_prince_valanar_icc::boss_prince_valanarAI::Reset(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::Reset(), boss_murmur::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetAllPowers(), Player::RestoreHealthAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetFullHealth(), SetMaxHealth(), boss_headless_horseman::SpellHit(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), boss_malchezaar::SpellHitTarget(), npc_giant_claw_tentacle::Submerge(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), npc_snobold_vassal::npc_snobold_vassalAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), boss_garfrost::boss_garfrostAI::UpdateAI(), boss_ick::boss_ickAI::UpdateAI(), boss_tyrannus::boss_tyrannusAI::UpdateAI(), boss_prince_valanar_icc::boss_prince_valanarAI::UpdateAI(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::UpdateAI(), Creature::UpdateEntry(), and boss_twin_valkyrAI::UpdateSharedHealth().

◆ SetHover()

bool Unit::SetHover ( bool  enable,
bool  packetOnly = false,
bool  updateAnimationTier = true 
)
virtual

Reimplemented in Creature, and Player.

20531{
20533 return false;
20534
20535 float hoverHeight = GetFloatValue(UNIT_FIELD_HOVERHEIGHT);
20536
20537 if (enable)
20538 {
20540 if (hoverHeight && GetPositionZ() - GetFloorZ() < hoverHeight)
20541 UpdateHeight(GetPositionZ() + hoverHeight);
20542 }
20543 else
20544 {
20546 if (hoverHeight && (!isDying() || !IsCreature()))
20547 {
20548 float newZ = std::max<float>(GetFloorZ(), GetPositionZ() - hoverHeight);
20550 UpdateHeight(newZ);
20551 }
20552 SendMovementFlagUpdate(); // pussywizard: needed for falling after death (instead of falling onto air at hover height)
20553 }
20554
20555 return true;
20556}
void UpdateHeight(float newZ)
Only server-side height update, does not broadcast to client.
Definition Unit.cpp:19890
void SendMovementFlagUpdate(bool self=false)
Definition Unit.cpp:16776
bool isDying() const
Definition Unit.h:1708
void UpdateAllowedPositionZ(float x, float y, float &z, float *groundZ=nullptr) const
Definition Object.cpp:1547
float GetFloorZ() const
Definition Object.cpp:3133

References AddUnitMovementFlag(), Object::GetFloatValue(), WorldObject::GetFloorZ(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), HasUnitMovementFlag(), Object::IsCreature(), isDying(), MOVEMENTFLAG_HOVER, RemoveUnitMovementFlag(), SendMovementFlagUpdate(), UNIT_FIELD_HOVERHEIGHT, WorldObject::UpdateAllowedPositionZ(), and UpdateHeight().

Referenced by AuraEffect::HandleAuraHover(), debug_commandscript::HandleDebugMoveflagsCommand(), setDeathState(), Creature::SetHover(), and Player::SetHover().

◆ SetImmuneToAll()

void Unit::SetImmuneToAll ( bool  apply,
bool  keepCombat = false 
)
inline
869{ SetImmuneToPC(apply, keepCombat); SetImmuneToNPC(apply, keepCombat); }
void SetImmuneToNPC(bool apply, bool keepCombat=false)
Definition Unit.cpp:13700

References SetImmuneToNPC(), and SetImmuneToPC().

Referenced by spell_the_lich_king_trigger_vile_spirit::ActivateSpirit(), boss_chromaggus::boss_chromaggusAI::boss_chromaggusAI(), boss_nalorakk::boss_nalorakk(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_warden_mellichar::npc_warden_mellicharAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_taldaram::DoAction(), boss_prince_keleseth_icc::boss_prince_kelesethAI::DoAction(), boss_prince_taldaram_icc::boss_prince_taldaramAI::DoAction(), boss_prince_valanar_icc::boss_prince_valanarAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), npc_living_constellation::npc_living_constellationAI::DoAction(), boss_broggok::DoAction(), boss_grand_warlock_nethekurse::DoAction(), boss_felblood_kaelthas::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_ambassador_hellmaw::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), boss_skeram::DoTeleport(), Spell::EffectSummonType(), npc_ghostly_priest::npc_ghostly_priestAI::EnterEvadeMode(), npc_phantom_mage::npc_phantom_mageAI::EnterEvadeMode(), npc_shadowy_mercenary::npc_shadowy_mercenaryAI::EnterEvadeMode(), npc_spectral_footman::npc_spectral_footmanAI::EnterEvadeMode(), npc_tortured_rifleman::npc_tortured_riflemanAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), spell_uldaman_stoned_aura::HandleEffectApply(), spell_uldaman_stoned_aura::HandleEffectRemove(), spell_q11919_q11940_drake_hunt_aura::HandleEffectRemove(), spell_item_draenic_pale_ale::HandleSummon(), boss_majordomo::boss_majordomoAI::InitializeAI(), boss_captain_skarloc::InitializeAI(), boss_taldaram::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::InitializeAI(), boss_prince_taldaram_icc::boss_prince_taldaramAI::InitializeAI(), boss_prince_valanar_icc::boss_prince_valanarAI::InitializeAI(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), npc_lord_arete::npc_lord_areteAI::InitializeAI(), boss_ambassador_hellmaw::InitializeAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::InitializeAI(), Player::InitStatsForLevel(), boss_falric::boss_falricAI::JustEngagedWith(), boss_marwyn::boss_marwynAI::JustEngagedWith(), boss_moroes::JustEngagedWith(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), npc_rinji::npc_rinjiAI::JustRespawned(), npc_isla_starmane::npc_isla_starmaneAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), boss_skeram::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), boss_captain_skarloc::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_dkc1_gothik::npc_dkc1_gothikAI::MoveInLineOfSight(), boss_nalorakk::MoveInLineOfSight(), boss_captain_skarloc::MovementInform(), boss_taldaram::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_sister_svalna::boss_sister_svalnaAI::MovementInform(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MovementInform(), npc_enslaved_proto_drake::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), npc_memory::npc_memoryAI::npc_memoryAI(), npc_rinji::npc_rinjiAI::npc_rinjiAI(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::npc_scarlet_miner_cartAI(), instance_zulaman::instance_zulaman_InstanceMapScript::OnCreatureCreate(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_ragnaros::boss_ragnarosAI::Reset(), boss_mandokir::boss_mandokirAI::Reset(), boss_skeram::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), boss_falric::boss_falricAI::Reset(), boss_marwyn::boss_marwynAI::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_sister_svalna::boss_sister_svalnaAI::Reset(), boss_svala::boss_svalaAI::Reset(), npc_thassarian::npc_thassarianAI::Reset(), boss_ambassador_hellmaw::Reset(), boss_broggok::Reset(), boss_grand_warlock_nethekurse::Reset(), npc_warden_mellichar::npc_warden_mellicharAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_svala::boss_svalaAI::SetData(), npc_blackhand_incarcerator::npc_blackhand_incarceratorAI::SetData(), boss_chromaggus::boss_chromaggusAI::SetGUID(), boss_black_knight::boss_black_knightAI::SpellHitTarget(), npc_rinji::npc_rinjiAI::sQuestAccept(), boss_majordomo::boss_majordomoAI::SummonedCreatureDies(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), boss_mandokir::boss_mandokirAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_skeram::UpdateAI(), npc_memory::npc_memoryAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), npc_crok_scourgebane::npc_crok_scourgebaneAI::UpdateAI(), boss_svala::boss_svalaAI::UpdateAI(), boss_anzu::UpdateAI(), npc_millhouse_manastorm::npc_millhouse_manastormAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), and npc_franklin::npc_franklinAI::UpdateAI().

◆ SetImmuneToNPC()

◆ SetImmuneToPC()

void Unit::SetImmuneToPC ( bool  apply,
bool  keepCombat = false 
)
13692{
13693 (void)keepCombat;
13694 if (apply)
13696 else
13698}

References RemoveUnitFlag(), SetUnitFlag(), and UNIT_FLAG_IMMUNE_TO_PC.

Referenced by boss_victor_nefarius::boss_victor_nefariusAI::BeginEvent(), boss_the_lich_king::boss_the_lich_kingAI::boss_the_lich_kingAI(), ClearInCombat(), npc_magister_aledis::DamageTaken(), boss_dorothee::DoAction(), boss_roar::DoAction(), boss_strawman::DoAction(), boss_tinhead::DoAction(), boss_apothecary_hummel::boss_apothecary_hummelAI::DoAction(), npc_apothecary_genericAI::DoAction(), npc_coren_direbrew::DoAction(), npc_direbrew_antagonist::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectApply(), spell_q11396_11399_force_shield_arcane_purple_x3::HandleEffectRemove(), spell_chapter2_persuasive_strike::HandleHit(), boss_felmyst::InitializeAI(), npc_shadow_of_doom::IsSummonedBy(), boss_blackheart_the_inciter::JustEngagedWith(), npc_spinestalker::npc_spinestalkerAI::MovementInform(), npc_rimefang::npc_rimefangAI::MovementInform(), npc_omen::npc_omenAI::MovementInform(), npc_omen::npc_omenAI::npc_omenAI(), instance_ulduar::instance_ulduar_InstanceMapScript::OnPlayerEnter(), npc_kaya_flathoof::OnQuestAccept(), boss_doomrel::boss_doomrelAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_julianne::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_a_special_surprise::npc_a_special_surpriseAI::Reset(), npc_coren_direbrew::Reset(), boss_general_zarithrian::boss_general_zarithrianAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), boss_gothik::boss_gothikAI::Reset(), boss_algalon_the_observer::boss_algalon_the_observerAI::Reset(), npc_venture_co_straggler::npc_venture_co_stragglerAI::Reset(), boss_blackheart_the_inciter::Reset(), boss_magtheridon::Reset(), npc_magister_aledis::Reset(), npc_shadow_of_doom::Reset(), boss_magtheridon::ScheduleCombatEvents(), SetImmuneToAll(), SetInCombatState(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_infernal_attacker::npc_infernal_attackerAI::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), boss_felmyst::StartIntro(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::UpdateAI(), npc_unworthy_initiate::npc_unworthy_initiateAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), boss_gothik::boss_gothikAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_magister_aledis::UpdateAI(), and npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI().

◆ SetInCombatState()

void Unit::SetInCombatState ( bool  PvP,
Unit enemy = nullptr,
uint32  duration = 0 
)
13823{
13824 // only alive units can be in combat
13825 if (!IsAlive())
13826 return;
13827
13828 if (PvP)
13829 m_CombatTimer = std::max<uint32>(GetCombatTimer(), std::max<uint32>(5500, duration));
13830 else if (duration)
13831 m_CombatTimer = std::max<uint32>(GetCombatTimer(), duration);
13832
13834 return;
13835
13836 // xinef: if we somehow engage in combat (scripts, dunno) with player, remove this flag so he can fight back
13837 if (IsCreature() && enemy && IsImmuneToPC() && enemy->GetCharmerOrOwnerPlayerOrPlayerItself())
13838 SetImmuneToPC(false); // unit has engaged in combat, remove immunity so players can fight back
13839
13840 if (IsInCombat())
13841 return;
13842
13844
13845 if (Creature* creature = ToCreature())
13846 {
13847 // Set home position at place of engaging combat for escorted creatures
13848 if ((IsAIEnabled && creature->AI()->IsEscorted()) ||
13849 GetMotionMaster()->GetCurrentMovementGeneratorType() == WAYPOINT_MOTION_TYPE ||
13850 GetMotionMaster()->GetCurrentMovementGeneratorType() == ESCORT_MOTION_TYPE)
13851 creature->SetHomePosition(GetPositionX(), GetPositionY(), GetPositionZ(), GetOrientation());
13852
13853 if (enemy)
13854 {
13855 creature->UpdateLeashExtensionTime();
13856
13857 if (IsAIEnabled)
13858 creature->AI()->JustEngagedWith(enemy);
13859
13860 if (creature->GetFormation())
13861 creature->GetFormation()->MemberEngagingTarget(creature, enemy);
13862
13863 sScriptMgr->OnUnitEnterCombat(creature, enemy);
13864 }
13865
13866 creature->RefreshSwimmingFlag();
13867
13868 if (IsPet())
13869 {
13870 UpdateSpeed(MOVE_RUN, true);
13871 UpdateSpeed(MOVE_SWIM, true);
13872 UpdateSpeed(MOVE_FLIGHT, true);
13873 }
13874
13875 if (!(creature->GetCreatureTemplate()->type_flags & CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT))
13876 Dismount();
13877 if (!IsStandState()) // pussywizard: already done in CombatStart(target, initialAggro) for the target, but when aggro'ing from MoveInLOS CombatStart is not called!
13879 }
13880
13881 for (Unit::ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end();)
13882 {
13883 Unit* controlled = *itr;
13884 ++itr;
13885
13886 // Xinef: Dont set combat for passive units, they will evade in next update...
13887 if (controlled->IsCreature() && controlled->ToCreature()->HasReactState(REACT_PASSIVE))
13888 continue;
13889
13890 controlled->SetInCombatState(PvP, enemy, duration);
13891 }
13892
13893 if (Player* player = this->ToPlayer())
13894 {
13895 sScriptMgr->OnPlayerEnterCombat(player, enemy);
13896 }
13897}
@ ESCORT_MOTION_TYPE
Definition MotionMaster.h:57
@ WAYPOINT_MOTION_TYPE
Definition MotionMaster.h:41
@ CREATURE_TYPE_NON_COMBAT_PET
Definition SharedDefines.h:2639
@ CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT
Definition SharedDefines.h:2706
@ MOVE_FLIGHT
Definition UnitDefines.h:355
@ MOVE_SWIM
Definition UnitDefines.h:352
bool HasReactState(ReactStates state) const
Definition Creature.h:97
uint32 GetCombatTimer() const
Definition Unit.h:889
void SetInCombatState(bool PvP, Unit *enemy=nullptr, uint32 duration=0)
Definition Unit.cpp:13822
bool IsStandState() const
Definition Unit.cpp:16792

References CREATURE_TYPE_FLAG_ALLOW_MOUNTED_COMBAT, CREATURE_TYPE_NON_COMBAT_PET, Dismount(), ESCORT_MOTION_TYPE, GetCharmerOrOwnerPlayerOrPlayerItself(), GetCombatTimer(), GetCreatureType(), GetMotionMaster(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Creature::HasReactState(), HasUnitState(), IsAIEnabled, IsAlive(), Object::IsCreature(), IsImmuneToPC(), IsInCombat(), IsPet(), IsStandState(), m_CombatTimer, m_Controlled, MOVE_FLIGHT, MOVE_RUN, MOVE_SWIM, REACT_PASSIVE, SetImmuneToPC(), SetInCombatState(), SetStandState(), SetUnitFlag(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), UNIT_FLAG_IN_COMBAT, UNIT_STAND_STATE_STAND, UNIT_STATE_EVADE, UpdateSpeed(), and WAYPOINT_MOTION_TYPE.

Referenced by Spell::DoSpellHitOnUnit(), SetInCombatState(), and SetInCombatWith().

◆ SetInCombatWith()

void Unit::SetInCombatWith ( Unit enemy,
uint32  duration = 0 
)
13665{
13666 // Xinef: Dont allow to start combat with triggers
13667 if (enemy->IsCreature() && enemy->ToCreature()->IsTrigger())
13668 return;
13669
13670 Unit* eOwner = enemy->GetCharmerOrOwnerOrSelf();
13671 if (eOwner->IsPvP() || eOwner->IsFFAPvP())
13672 {
13673 SetInCombatState(true, enemy, duration);
13674 return;
13675 }
13676
13677 // check for duel
13678 if (eOwner->IsPlayer() && eOwner->ToPlayer()->duel)
13679 {
13680 Unit const* myOwner = GetCharmerOrOwnerOrSelf();
13681 if (((Player const*)eOwner)->duel->Opponent == myOwner)
13682 {
13683 SetInCombatState(true, enemy, duration);
13684 return;
13685 }
13686 }
13687
13688 SetInCombatState(false, enemy, duration);
13689}

References Player::duel, GetCharmerOrOwnerOrSelf(), Object::IsCreature(), IsFFAPvP(), Object::IsPlayer(), IsPvP(), Creature::IsTrigger(), SetInCombatState(), Object::ToCreature(), and Object::ToPlayer().

Referenced by Attack(), npc_daphne_stilwell::npc_daphne_stilwellAI::AttackStart(), CombatStart(), CombatStartOnCast(), npc_centrifuge_construct::npc_centrifuge_constructAI::DamageTaken(), Spell::DoAllEffectOnTarget(), CreatureAI::DoZoneInCombat(), boss_sapphiron::boss_sapphironAI::EnterCombatSelfFunction(), spell_herald_volzaj_insanity::HandleDummyEffect(), boss_chromaggus::boss_chromaggusAI::PathEndReached(), SmartScript::ProcessAction(), npc_high_overlord_saurfang_igb::npc_high_overlord_saurfang_igbAI::UpdateAI(), npc_muradin_bronzebeard_igb::npc_muradin_bronzebeard_igbAI::UpdateAI(), npc_gunship_boarding_addAI::UpdateAI(), and npc_gunship_gunner::npc_gunship_gunnerAI::UpdateAI().

◆ SetInFront()

◆ SetInstantCast()

void Unit::SetInstantCast ( bool  set)
inline
1505{ _instantCast = set; }

References _instantCast.

Referenced by AuraEffect::HandleModCastingSpeed().

◆ SetLastDamagedTargetGuid()

void Unit::SetLastDamagedTargetGuid ( ObjectGuid const &  guid)
inline

◆ SetLastExtraAttackSpell()

void Unit::SetLastExtraAttackSpell ( uint32  spellId)
inline
948{ _lastExtraAttackSpell = spellId; }

References _lastExtraAttackSpell.

Referenced by Spell::_handle_finish_phase().

◆ SetLastManaUse()

void Unit::SetLastManaUse ( uint32  spellCastTime)
inline
1075{ m_lastManaUse = spellCastTime; }

References m_lastManaUse.

Referenced by Spell::TakePower().

◆ SetLevel()

◆ SetMaxHealth()

void Unit::SetMaxHealth ( uint32  val)
15619{
15620 if (!val)
15621 val = 1;
15622
15623 uint32 health = GetHealth();
15625
15626 // group update
15627 if (IsPlayer())
15628 {
15629 Player* player = ToPlayer();
15630 if (player->NeedSendSpectatorData())
15632
15633 if (player->GetGroup())
15635 }
15636 else if (Pet* pet = ToCreature()->ToPet())
15637 {
15638 if (pet->isControlled())
15639 {
15640 if (Unit* owner = GetOwner())
15641 if (Player* player = owner->ToPlayer())
15642 {
15643 if (player->NeedSendSpectatorData() && pet->GetCreatureTemplate()->family)
15644 ArenaSpectator::SendCommand_UInt32Value(player->FindMap(), player->GetGUID(), "PHP", (uint32)pet->GetHealthPct());
15645
15646 if (player->GetGroup())
15648 }
15649 }
15650 }
15651
15652 if (val < health)
15653 SetHealth(val);
15654}
@ GROUP_UPDATE_FLAG_MAX_HP
Definition Group.h:102
@ GROUP_UPDATE_FLAG_PET_MAX_HP
Definition Group.h:114

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetHealth(), GetOwner(), GROUP_UPDATE_FLAG_MAX_HP, GROUP_UPDATE_FLAG_PET_MAX_HP, Object::IsPlayer(), Player::NeedSendSpectatorData(), ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetHealth(), SetUInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXHEALTH.

Referenced by boss_xt002::boss_xt002AI::DoAction(), Spell::EffectSummonType(), modify_commandscript::HandleModifyHPCommand(), npc_commandscript::HandleNpcSetLevelCommand(), npc_pet_pri_lightwell::InitializeAI(), Player::InitStatsForLevel(), boss_skeram::JustSummoned(), npc_corrupted_totem::npc_corrupted_totem(), npc_xt002_life_spark::npc_xt002_life_sparkAI::npc_xt002_life_sparkAI(), Creature::SelectLevel(), npc_pet_hunter_snake_trap::UpdateAI(), Creature::UpdateMaxHealth(), Guardian::UpdateMaxHealth(), and Player::UpdateMaxHealth().

◆ SetMaxPower()

void Unit::SetMaxPower ( Powers  power,
uint32  val 
)
15708{
15709 uint32 cur_power = GetPower(power);
15710 SetStatInt32Value(static_cast<uint16>(UNIT_FIELD_MAXPOWER1) + power, val);
15711
15712 // group update
15713 if (IsPlayer())
15714 {
15715 Player* player = ToPlayer();
15716 if (getPowerType() == power && player->NeedSendSpectatorData())
15717 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15718
15719 if (player->GetGroup())
15721 }
15722 else if (Pet* pet = ToCreature()->ToPet())
15723 {
15724 if (pet->isControlled())
15725 {
15726 Unit* owner = GetOwner();
15727 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15729 }
15730 }
15731
15732 if (val < cur_power)
15733 SetPower(power, val);
15734}
@ GROUP_UPDATE_FLAG_PET_MAX_POWER
Definition Group.h:117
@ GROUP_UPDATE_FLAG_MAX_POWER
Definition Group.h:105
void SetStatInt32Value(uint16 index, int32 value)
Definition Object.cpp:798

References WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetOwner(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_MAX_POWER, GROUP_UPDATE_FLAG_PET_MAX_POWER, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Player::SetGroupUpdateFlag(), SetPower(), Object::SetStatInt32Value(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_MAXPOWER1.

Referenced by Player::Create(), Pet::CreateBaseAtTamed(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Pet::LoadPetFromDB(), Creature::SelectLevel(), setPowerType(), Creature::UpdateMaxPower(), Guardian::UpdateMaxPower(), and Player::UpdateMaxPower().

◆ SetMinion()

void Unit::SetMinion ( Minion minion,
bool  apply 
)
10772{
10773 LOG_DEBUG("entities.unit", "SetMinion {} for {}, apply {}", minion->GetEntry(), GetEntry(), apply);
10774
10775 if (apply)
10776 {
10777 if (minion->GetOwnerGUID())
10778 {
10779 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10780 return;
10781 }
10782
10783 minion->SetOwnerGUID(GetGUID());
10784
10785 m_Controlled.insert(minion);
10786
10787 if (IsPlayer())
10788 {
10789 minion->m_ControlledByPlayer = true;
10791 }
10792
10793 // Can only have one pet. If a new one is summoned, dismiss the old one.
10794 if (minion->IsGuardianPet())
10795 {
10796 if (Guardian* oldPet = GetGuardianPet())
10797 {
10798 if (oldPet != minion && (oldPet->IsPet() || minion->IsPet() || oldPet->GetEntry() != minion->GetEntry()))
10799 {
10800 // remove existing minion pet
10801 if (Pet* oldPetAsPet = oldPet->ToPet())
10802 {
10803 oldPetAsPet->Remove(PET_SAVE_NOT_IN_SLOT);
10804 }
10805 else
10806 {
10807 oldPet->UnSummon();
10808 }
10809
10810 SetPetGUID(minion->GetGUID());
10812 }
10813 }
10814 else
10815 {
10816 SetPetGUID(minion->GetGUID());
10818 }
10819 }
10820
10822 {
10824 }
10825
10826 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10827 {
10828 SetCritterGUID(minion->GetGUID());
10829 }
10830
10831 // PvP, FFAPvP
10833
10834 // Ghoul pets have energy instead of mana (is anywhere better place for this code?)
10835 if (minion->IsPetGhoul() || minion->GetEntry() == 24207 /*ENTRY_ARMY_OF_THE_DEAD*/)
10836 minion->setPowerType(POWER_ENERGY);
10837
10838 if (IsPlayer())
10839 {
10840 // Send infinity cooldown - client does that automatically but after relog cooldown needs to be set again
10841 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10842
10843 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10844 ToPlayer()->AddSpellAndCategoryCooldowns(spellInfo, 0, nullptr, true);
10845 }
10846 }
10847 else
10848 {
10849 if (minion->GetOwnerGUID() != GetGUID())
10850 {
10851 LOG_FATAL("entities.unit", "SetMinion: Minion {} is not the minion of owner {}", minion->GetEntry(), GetEntry());
10852 return;
10853 }
10854
10855 m_Controlled.erase(minion);
10856
10857 if (minion->m_Properties && minion->m_Properties->Type == SUMMON_TYPE_MINIPET)
10858 {
10859 if (GetCritterGUID() == minion->GetGUID())
10861 }
10862
10863 if (minion->IsGuardianPet())
10864 {
10865 if (GetPetGUID() == minion->GetGUID())
10867 }
10868 else if (minion->IsTotem())
10869 {
10870 // All summoned by totem minions must disappear when it is removed.
10871 if (SpellInfo const* spInfo = sSpellMgr->GetSpellInfo(minion->ToTotem()->GetSpell()))
10872 {
10873 for (int i = 0; i < MAX_SPELL_EFFECTS; ++i)
10874 {
10875 if (spInfo->Effects[i].Effect != SPELL_EFFECT_SUMMON)
10876 continue;
10877
10878 RemoveAllMinionsByEntry(spInfo->Effects[i].MiscValue);
10879 }
10880 }
10881 }
10882
10883 if (IsPlayer())
10884 {
10885 SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(minion->GetUInt32Value(UNIT_CREATED_BY_SPELL));
10886 // Remove infinity cooldown
10887 if (spellInfo && spellInfo->IsCooldownStartedOnEvent())
10888 ToPlayer()->SendCooldownEvent(spellInfo);
10889
10890 // xinef: clear spell book
10891 if (m_Controlled.empty())
10893 }
10894
10895 //if (minion->HasUnitTypeMask(UNIT_MASK_GUARDIAN))
10896 {
10898 {
10899 // Check if there is another minion
10900 for (ControlSet::iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
10901 {
10902 // do not use this check, creature do not have charm guid
10903 //if (GetCharmGUID() == (*itr)->GetGUID())
10904 if (GetGUID() == (*itr)->GetCharmerGUID())
10905 continue;
10906
10907 //ASSERT((*itr)->GetOwnerGUID() == GetGUID());
10908 if ((*itr)->GetOwnerGUID() != GetGUID())
10909 {
10910 OutDebugInfo();
10911 (*itr)->OutDebugInfo();
10912 ABORT();
10913 }
10914 ASSERT((*itr)->IsCreature());
10915
10916 if (!(*itr)->HasUnitTypeMask(UNIT_MASK_CONTROLLABLE_GUARDIAN))
10917 continue;
10918
10919 if (AddGuidValue(UNIT_FIELD_SUMMON, (*itr)->GetGUID()))
10920 {
10921 // show another pet bar if there is no charm bar
10922 if (IsPlayer() && !GetCharmGUID())
10923 {
10924 if ((*itr)->IsPet())
10926 else
10928 }
10929 }
10930 break;
10931 }
10932 }
10933 }
10934 }
10935}
@ PET_SAVE_NOT_IN_SLOT
Definition PetDefines.h:45
@ SPELL_EFFECT_SUMMON
Definition SharedDefines.h:806
@ SUMMON_TYPE_MINIPET
Definition SharedDefines.h:3538
bool IsGuardianPet() const
Definition TemporarySummon.cpp:391
bool IsPetGhoul() const
Definition TemporarySummon.h:85
void PetSpellInitialize()
Definition Player.cpp:9499
const SummonPropertiesEntry *const m_Properties
Definition TemporarySummon.h:64
uint32 GetSpell(uint8 slot=0) const
Definition Totem.h:59
void OutDebugInfo() const
Definition Unit.cpp:20053
ObjectGuid GetCritterGUID() const
Definition Unit.h:680
void SetOwnerGUID(ObjectGuid owner)
Definition Unit.cpp:10659
void SetCritterGUID(ObjectGuid guid)
Definition Unit.h:679
void setPowerType(Powers power)
Definition Unit.cpp:10040
void RemoveAllMinionsByEntry(uint32 entry)
Definition Unit.cpp:10949
uint32 Type
Definition DBCStructure.h:1914

References ABORT, Object::AddGuidValue(), Player::AddSpellAndCategoryCooldowns(), ASSERT, Player::CharmSpellInitialize(), ObjectGuid::Empty, Object::GetByteValue(), GetCharmGUID(), GetCritterGUID(), Object::GetEntry(), GetGuardianPet(), Object::GetGUID(), Object::GetGUID(), GetOwnerGUID(), GetPetGUID(), Totem::GetSpell(), Object::GetUInt32Value(), HasUnitTypeMask(), SpellInfo::IsCooldownStartedOnEvent(), Minion::IsGuardianPet(), IsPet(), Minion::IsPetGhoul(), Object::IsPlayer(), IsTotem(), LOG_DEBUG, LOG_FATAL, m_Controlled, m_ControlledByPlayer, TempSummon::m_Properties, MAX_SPELL_EFFECTS, OutDebugInfo(), PET_SAVE_NOT_IN_SLOT, Player::PetSpellInitialize(), POWER_ENERGY, RemoveAllMinionsByEntry(), Object::RemoveGuidValue(), Player::SendCooldownEvent(), Player::SendRemoveControlBar(), Object::SetByteValue(), SetCritterGUID(), SetMinionGUID(), SetOwnerGUID(), SetPetGUID(), setPowerType(), SetUnitFlag(), SPELL_EFFECT_SUMMON, sSpellMgr, SUMMON_TYPE_MINIPET, ToPet(), Object::ToPlayer(), ToTotem(), SummonPropertiesEntry::Type, UNIT_CREATED_BY_SPELL, UNIT_FIELD_BYTES_2, UNIT_FIELD_SUMMON, UNIT_FLAG_PLAYER_CONTROLLED, and UNIT_MASK_CONTROLLABLE_GUARDIAN.

Referenced by Player::CreatePet(), Player::CreatePet(), Spell::EffectCreateTamedPet(), Spell::EffectTameCreature(), Pet::LoadPetFromDB(), Player::RemovePet(), and Player::SummonPet().

◆ SetMinionGUID()

void Unit::SetMinionGUID ( ObjectGuid  guid)
inline

◆ SetModelVisible()

◆ SetModifierValue()

◆ SetNativeDisplayId()

◆ SetNpcFlag()

void Unit::SetNpcFlag ( NPCFlags  flags)
inline
719{ SetFlag(UNIT_NPC_FLAGS, flags); }

References Object::SetFlag(), and UNIT_NPC_FLAGS.

Referenced by Vehicle::AddPassenger(), npc_riggle_bassbait::npc_riggle_bassbaitAI::CheckTournamentState(), npc_ulduar_arachnopod_destroyer::npc_ulduar_arachnopod_destroyerAI::DamageTaken(), npc_magister_aledis::DamageTaken(), npc_thrall_warchief::npc_thrall_warchiefAI::DoAction(), boss_vaelastrasz::boss_vaelAI::Initialize(), boss_majordomo::boss_majordomoAI::InitializeAI(), npc_sergeant_bly::npc_sergeant_blyAI::InitializeAI(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::InitializeAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::JustDied(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::JustReachedHome(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_chesspiece::MovementInform(), npc_fos_leader_second::npc_fos_leader_secondAI::MovementInform(), npc_pos_leader_second::npc_pos_leader_secondAI::MovementInform(), npc_weegli_blastfuse::npc_weegli_blastfuseAI::MovementInform(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::MovementInform(), npc_chesspiece::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_akama_illidan::PathEndReached(), npc_chicken_cluck::npc_chicken_cluckAI::ReceiveEmote(), npc_plucky::npc_pluckyAI::ReceiveEmote(), Vehicle::RemovePassenger(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_apothecary_hummel::boss_apothecary_hummelAI::Reset(), npc_deathstalker_fearleia::Reset(), npc_varian_wrynn::npc_varian_wrynnAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_azuregos::boss_azuregosAI::Reset(), npc_hyjal_jaina::hyjalJainaAI::Reset(), npc_hyjal_thrall::hyjalThrallAI::Reset(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::Reset(), npc_belnistrasz::npc_belnistraszAI::Reset(), npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::Reset(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_akama_illidan::Reset(), npc_akama_shade::Reset(), npc_magister_aledis::Reset(), Vehicle::Reset(), npc_battle_at_valhalas::npc_battle_at_valhalasAI::ResetData(), NPCStaveQuestAI::ResetState(), boss_majordomo::boss_majordomoAI::SpellHit(), npc_aged_dying_ancient_kodo::npc_aged_dying_ancient_kodoAI::SpellHit(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_xerestrasza::npc_xerestraszaAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_isle_of_conquest_turret::npc_isle_of_conquest_turretAI::UpdateAI(), npc_oculus_drakegiver::npc_oculus_drakegiverAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_shandy_dalaran::npc_shandy_dalaranAI::UpdateAI(), npc_lake_frog::npc_lake_frogAI::UpdateAI(), npc_aeranas::npc_aeranasAI::UpdateAI(), Vehicle::Vehicle(), npc_arthas::npc_arthasAI::WaypointReached(), npc_daphne_stilwell::npc_daphne_stilwellAI::WaypointReached(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), npc_general_andorov::WaypointReached(), and npc_cork_gizelton::npc_cork_gizeltonAI::WaypointReached().

◆ SetOwnerGUID()

void Unit::SetOwnerGUID ( ObjectGuid  owner)
10660{
10661 if (GetOwnerGUID() == owner)
10662 return;
10663
10665 if (!owner)
10666 return;
10667
10668 m_applyResilience = !IsVehicle() && owner.IsPlayer();
10669
10670 // Update owner dependent fields
10671 Player* player = ObjectAccessor::GetPlayer(*this, owner);
10672 if (!player || !player->HaveAtClient(this)) // if player cannot see this unit yet, he will receive needed data with create object
10673 return;
10674
10676
10677 UpdateData udata;
10678 WorldPacket packet;
10679 BuildValuesUpdateBlockForPlayer(&udata, player);
10680 udata.BuildPacket(packet);
10681 player->SendDirectMessage(&packet);
10682
10684}
void BuildValuesUpdateBlockForPlayer(UpdateData *data, Player *target)
Definition Object.cpp:257
void RemoveFieldNotifyFlag(uint16 flag)
Definition Object.h:196
void SetFieldNotifyFlag(uint16 flag)
Definition Object.h:195
bool HaveAtClient(WorldObject const *u) const
Definition Player.cpp:11389
Definition UpdateData.h:52
bool BuildPacket(WorldPacket &packet)
Definition UpdateData.cpp:48

References UpdateData::BuildPacket(), Object::BuildValuesUpdateBlockForPlayer(), GetOwnerGUID(), ObjectAccessor::GetPlayer(), Player::HaveAtClient(), ObjectGuid::IsPlayer(), IsVehicle(), m_applyResilience, Object::RemoveFieldNotifyFlag(), Player::SendDirectMessage(), Object::SetFieldNotifyFlag(), Object::SetGuidValue(), UF_FLAG_OWNER, and UNIT_FIELD_SUMMONEDBY.

Referenced by GameObject::CastSpell(), Spell::EffectSummonType(), boss_illidari_council_memberAI::EnterEvadeMode(), spell_item_draenic_pale_ale::HandleSummon(), npc_pet_gen_fetch_ball::IsSummonedBy(), boss_razorgore::boss_razorgoreAI::JustSummoned(), Player::LoadFromDB(), SetMinion(), and npc_grimstone::npc_grimstoneAI::UpdateEscortAI().

◆ SetPetGUID()

◆ SetPhaseMask()

void Unit::SetPhaseMask ( uint32  newPhaseMask,
bool  update 
)
overridevirtual

Reimplemented from WorldObject.

19136{
19137 if (newPhaseMask == GetPhaseMask())
19138 return;
19139
19140 if (IsInWorld())
19141 {
19142 // xinef: to comment, bellow line should be removed
19143 // pussywizard: goign to other phase (valithria, algalon) should not remove such auras
19144 //RemoveNotOwnSingleTargetAuras(newPhaseMask, true); // we can lost access to caster or target
19145
19146 if (!sScriptMgr->CanSetPhaseMask(this, newPhaseMask, update))
19147 return;
19148
19149 // modify hostile references for new phasemask, some special cases deal with hostile references themselves
19150 if (IsCreature() || (!ToPlayer()->IsGameMaster() && !ToPlayer()->GetSession()->PlayerLogout()))
19151 {
19152 HostileRefMgr& refMgr = getHostileRefMgr();
19153 HostileReference* ref = refMgr.getFirst();
19154
19155 while (ref)
19156 {
19157 if (Unit* unit = ref->GetSource()->GetOwner())
19158 if (Creature* creature = unit->ToCreature())
19159 refMgr.setOnlineOfflineState(creature, creature->InSamePhase(newPhaseMask));
19160
19161 ref = ref->next();
19162 }
19163
19164 // modify threat lists for new phasemask
19165 if (!IsPlayer())
19166 {
19169
19170 // merge expects sorted lists
19171 threatList.sort();
19172 offlineThreatList.sort();
19173 threatList.merge(offlineThreatList);
19174
19175 for (ThreatContainer::StorageType::const_iterator itr = threatList.begin(); itr != threatList.end(); ++itr)
19176 if (Unit* unit = (*itr)->getTarget())
19177 unit->getHostileRefMgr().setOnlineOfflineState(ToCreature(), unit->InSamePhase(newPhaseMask));
19178 }
19179 }
19180 }
19181
19182 WorldObject::SetPhaseMask(newPhaseMask, false);
19183
19184 if (!IsInWorld())
19185 {
19186 return;
19187 }
19188
19189 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); )
19190 {
19191 Unit* controlled = *itr;
19192 ++itr;
19193 if (controlled->IsCreature())
19194 {
19195 controlled->SetPhaseMask(newPhaseMask, true);
19196 }
19197 }
19198
19199 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
19200 {
19201 if (m_SummonSlot[i])
19202 {
19203 if (Creature* summon = GetMap()->GetCreature(m_SummonSlot[i]))
19204 {
19205 summon->SetPhaseMask(newPhaseMask, true);
19206 }
19207 }
19208 }
19209
19210 if (update)
19211 {
19213 }
19214}
Definition HostileRefMgr.h:31
void setOnlineOfflineState(bool isOnline)
Definition HostileRefMgr.cpp:98
HostileReference * getFirst()
Definition HostileRefMgr.h:59
HostileReference * next()
Definition ThreatMgr.h:115
FROM * GetSource() const
Definition Reference.h:97
ThreatContainer::StorageType const & GetOfflineThreatList() const
Definition ThreatMgr.h:274
Unit * GetOwner() const
Definition ThreatMgr.h:236
void SetPhaseMask(uint32 newPhaseMask, bool update) override
Definition Unit.cpp:19135
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:2882
uint32 GetPhaseMask() const
Definition Object.h:502

References Map::GetCreature(), HostileRefMgr::getFirst(), getHostileRefMgr(), WorldObject::GetMap(), ThreatMgr::GetOfflineThreatList(), ThreatMgr::GetOwner(), WorldObject::GetPhaseMask(), Reference< TO, FROM >::GetSource(), ThreatMgr::GetThreatList(), GetThreatMgr(), WorldObject::InSamePhase(), Object::IsCreature(), Object::IsInWorld(), Object::IsPlayer(), m_Controlled, m_SummonSlot, MAX_SUMMON_SLOT, HostileReference::next(), HostileRefMgr::setOnlineOfflineState(), WorldObject::SetPhaseMask(), SetPhaseMask(), sScriptMgr, Object::ToCreature(), Object::ToPlayer(), and UpdateObjectVisibility().

Referenced by Pet::Create(), Creature::Create(), misc_commandscript::HandleAppearCommand(), modify_commandscript::HandleModifyPhaseCommand(), npc_commandscript::HandleNpcSetPhaseCommand(), spell_wintergrasp_hide_small_elementals_aura::HandlePeriodicDummy(), AuraEffect::HandlePhase(), Battlefield::HideNpc(), boss_volazj::InitializeAI(), boss_zuramat::boss_zuramatAI::JustSummoned(), npc_the_lich_king_controller::npc_the_lich_king_controllerAI::JustSummoned(), BattlegroundAB::RemovePlayer(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_twilight_halion::boss_twilight_halionAI::Reset(), Creature::setDeathState(), Player::SetGameMaster(), SetPhaseMask(), Battlefield::ShowNpc(), WorldObject::SummonTrigger(), and npc_mootoo_the_younger::npc_mootoo_the_youngerAI::WaypointReached().

◆ SetPower()

void Unit::SetPower ( Powers  power,
uint32  val,
bool  withPowerUpdate = true,
bool  fromRegenerate = false 
)
15657{
15658 if (!fromRegenerate && GetPower(power) == val)
15659 return;
15660
15661 uint32 maxPower = GetMaxPower(power);
15662 if (maxPower < val)
15663 val = maxPower;
15664
15665 if (fromRegenerate)
15666 {
15669 }
15670 else
15672
15673 if (withPowerUpdate)
15674 {
15675 WorldPacket data(SMSG_POWER_UPDATE, 8 + 1 + 4);
15676 data << GetPackGUID();
15677 data << uint8(power);
15678 data << uint32(val);
15679 SendMessageToSet(&data, IsPlayer());
15680 }
15681
15682 // group update
15683 if (IsPlayer())
15684 {
15685 Player* player = ToPlayer();
15686 if (getPowerType() == power && player->NeedSendSpectatorData())
15687 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", power == POWER_RAGE || power == POWER_RUNIC_POWER ? val / 10 : val);
15688
15689 if (player->GetGroup())
15691 }
15692 else if (Pet* pet = ToCreature()->ToPet())
15693 {
15694 if (pet->isControlled())
15695 {
15696 Unit* owner = GetOwner();
15697 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
15699 }
15700
15701 // Update the pet's character sheet with happiness damage bonus
15702 if (pet->getPetType() == HUNTER_PET && power == POWER_HAPPINESS)
15703 pet->UpdateDamagePhysical(BASE_ATTACK);
15704 }
15705}
@ GROUP_UPDATE_FLAG_PET_CUR_POWER
Definition Group.h:116
@ GROUP_UPDATE_FLAG_CUR_POWER
Definition Group.h:104
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:619
void UpdateUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:663
void AddToObjectUpdateIfNeeded()
Definition Object.cpp:524
@ SMSG_POWER_UPDATE
Definition Opcodes.h:1182

References Object::AddToObjectUpdateIfNeeded(), AsUnderlyingType(), BASE_ATTACK, WorldObject::FindMap(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), Object::GetPackGUID(), GetPower(), getPowerType(), GROUP_UPDATE_FLAG_CUR_POWER, GROUP_UPDATE_FLAG_PET_CUR_POWER, HUNTER_PET, Object::IsPlayer(), Player::NeedSendSpectatorData(), POWER_HAPPINESS, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), WorldObject::SendMessageToSet(), Player::SetGroupUpdateFlag(), Object::SetStatInt32Value(), SMSG_POWER_UPDATE, Object::ToCreature(), ToPet(), Object::ToPlayer(), UNIT_FIELD_POWER1, and Object::UpdateUInt32Value().

Referenced by Player::ActivateSpec(), Player::Create(), Pet::CreateBaseAtTamed(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::DoAction(), Spell::EffectSelfResurrect(), Spell::EffectSummonPet(), Player::GiveLevel(), AuraEffect::HandleAuraModShapeshift(), spell_warr_execute::HandleEffect(), modify_commandscript::HandleModifyEnergyCommand(), modify_commandscript::HandleModifyManaCommand(), modify_commandscript::HandleModifyRageCommand(), modify_commandscript::HandleModifyRunicPowerCommand(), spell_dk_pet_scaling::HandlePeriodic(), spell_hun_generic_scaling::HandlePeriodic(), spell_mage_pet_scaling::HandlePeriodic(), spell_sha_feral_spirit_scaling::HandlePeriodic(), spell_warl_generic_scaling::HandlePeriodic(), AuraEffect::HandlePeriodicDummyAuraTick(), WorldSession::HandlePetAbandon(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), Creature::LoadCreatureFromDB(), Player::LoadFromDB(), Pet::LoadPetFromDB(), ModifyPower(), boss_shade_of_aran::OnPowerUpdate(), Player::ProcessDelayedOperations(), Player::Regenerate(), spell_igb_incinerating_blast::RemoveEnergy(), spell_igb_below_zero::RemovePassengers(), boss_curator::Reset(), boss_shade_of_aran::Reset(), boss_selin_fireheart::Reset(), boss_moam::Reset(), npc_obsidian_destroyer::Reset(), npc_obsidian_eradicator::Reset(), npc_obsidian_nullifier::Reset(), boss_deathbringer_saurfang::boss_deathbringer_saurfangAI::Reset(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::Reset(), Player::ResetAllPowers(), Player::RestoreManaAfterDuel(), Player::ResurectUsingRequestData(), Player::ResurrectPlayer(), Creature::SelectLevel(), setDeathState(), SetMaxPower(), setPowerType(), Player::SummonPet(), and npc_dalaran_mage::npc_dalaran_mageAI::UpdateAI().

◆ setPowerType()

void Unit::setPowerType ( Powers  power)
10041{
10042 SetByteValue(UNIT_FIELD_BYTES_0, 3, new_powertype);
10043
10044 if (IsPlayer())
10045 {
10046 if (ToPlayer()->GetGroup())
10048 }
10049 else if (Pet* pet = ToCreature()->ToPet())
10050 {
10051 if (pet->isControlled())
10052 {
10053 Unit* owner = GetOwner();
10054 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
10056 }
10057 }
10058
10059 float powerMultiplier = 1.0f;
10060 if (!IsPet())
10061 if (Creature* creature = ToCreature())
10062 powerMultiplier = creature->GetCreatureTemplate()->ModMana;
10063
10064 switch (new_powertype)
10065 {
10066 default:
10067 case POWER_MANA:
10068 break;
10069 case POWER_RAGE:
10070 SetMaxPower(POWER_RAGE, uint32(std::ceil(GetCreatePowers(POWER_RAGE) * powerMultiplier)));
10071 SetPower(POWER_RAGE, 0);
10072 break;
10073 case POWER_FOCUS:
10074 SetMaxPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10075 SetPower(POWER_FOCUS, uint32(std::ceil(GetCreatePowers(POWER_FOCUS) * powerMultiplier)));
10076 break;
10077 case POWER_ENERGY:
10078 SetMaxPower(POWER_ENERGY, uint32(std::ceil(GetCreatePowers(POWER_ENERGY) * powerMultiplier)));
10079 break;
10080 case POWER_HAPPINESS:
10081 SetMaxPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10082 SetPower(POWER_HAPPINESS, uint32(std::ceil(GetCreatePowers(POWER_HAPPINESS) * powerMultiplier)));
10083 break;
10084 }
10085
10086 if (Player const* player = ToPlayer())
10087 if (player->NeedSendSpectatorData())
10088 {
10089 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "PWT", new_powertype);
10090 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "MPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetMaxPower(new_powertype) / 10 : GetMaxPower(new_powertype));
10091 ArenaSpectator::SendCommand_UInt32Value(FindMap(), GetGUID(), "CPW", new_powertype == POWER_RAGE || new_powertype == POWER_RUNIC_POWER ? GetPower(new_powertype) / 10 : GetPower(new_powertype));
10092 }
10093}
@ GROUP_UPDATE_FLAG_POWER_TYPE
Definition Group.h:103
@ GROUP_UPDATE_FLAG_PET_POWER_TYPE
Definition Group.h:115
void SetMaxPower(Powers power, uint32 val)
Definition Unit.cpp:15707

References WorldObject::FindMap(), GetCreatePowers(), Player::GetGroup(), Object::GetGUID(), GetMaxPower(), GetOwner(), GetPower(), GROUP_UPDATE_FLAG_PET_POWER_TYPE, GROUP_UPDATE_FLAG_POWER_TYPE, IsPet(), Object::IsPlayer(), POWER_ENERGY, POWER_FOCUS, POWER_HAPPINESS, POWER_MANA, POWER_RAGE, POWER_RUNIC_POWER, ArenaSpectator::SendCommand_UInt32Value(), Object::SetByteValue(), Player::SetGroupUpdateFlag(), SetMaxPower(), SetPower(), Object::ToCreature(), ToPet(), Object::ToPlayer(), and UNIT_FIELD_BYTES_0.

Referenced by Pet::CreateBaseAtTamed(), AuraEffect::HandleAuraModShapeshift(), spell_putricide_mutated_transformation::HandleSummon(), Player::InitDataForForm(), Vehicle::Install(), Pet::LoadPetFromDB(), npc_toc_rogue::npc_toc_rogueAI::npc_toc_rogueAI(), SetMinion(), and Player::SummonPet().

◆ SetPvP()

◆ setRace()

void Unit::setRace ( uint8  race)
20877{
20878 if (IsPlayer())
20879 m_race = race;
20880}

References Object::IsPlayer(), and m_race.

◆ SetRedirectThreat()

void Unit::SetRedirectThreat ( ObjectGuid  guid,
uint32  pct 
)
inline
905{ _redirectThreatInfo.Set(guid, pct); }
void Set(ObjectGuid guid, uint32 pct)
Definition ThreatMgr.h:301

References _redirectThreatInfo, and RedirectThreatInfo::Set().

Referenced by Spell::EffectRedirectThreat(), and ResetRedirectThreat().

◆ SetResistance()

◆ SetResistanceBuffMods()

void Unit::SetResistanceBuffMods ( SpellSchools  school,
bool  positive,
float  val 
)
inline

◆ SetRooted()

void Unit::SetRooted ( bool  apply,
bool  isStun = false 
)
protected
18291{
18292 if (apply)
18293 {
18294 if (m_rootTimes > 0) // blizzard internal check?
18295 m_rootTimes++;
18296
18297 // MOVEMENTFLAG_ROOT cannot be used in conjunction with MOVEMENTFLAG_MASK_MOVING (tested 3.3.5a)
18298 // this will freeze clients. That's why we remove MOVEMENTFLAG_MASK_MOVING before
18299 // setting MOVEMENTFLAG_ROOT
18301
18302 if (IsFalling())
18303 {
18305 }
18306 else
18307 {
18309 }
18310
18311 // Creature specific
18312 if (!IsPlayer())
18313 {
18314 if (isStun && movespline->Finalized())
18315 {
18317 }
18318 else
18319 {
18320 StopMoving();
18321 }
18322 }
18323
18324 if (m_movedByPlayer)
18325 {
18326 WorldPacket data(SMSG_FORCE_MOVE_ROOT, GetPackGUID().size() + 4);
18327 data << GetPackGUID();
18328 data << m_rootTimes;
18330 }
18331 else
18332 {
18334 data << GetPackGUID();
18335 SendMessageToSet(&data, true);
18336 }
18337 }
18338 else
18339 {
18341
18342 if (!HasUnitState(UNIT_STATE_STUNNED)) // prevent moving if it also has stun effect
18343 {
18344 if (m_movedByPlayer)
18345 {
18347 data << GetPackGUID();
18348 data << m_rootTimes;
18350 }
18351 else
18352 {
18354 data << GetPackGUID();
18355 SendMessageToSet(&data, true);
18356 }
18357 }
18358 }
18359}
@ MOVEMENTFLAG_PENDING_ROOT
Definition UnitDefines.h:385
void StopMovingOnCurrentPos()
Definition Unit.cpp:16761
@ SMSG_FORCE_MOVE_UNROOT
Definition Opcodes.h:264
@ SMSG_FORCE_MOVE_ROOT
Definition Opcodes.h:262
@ SMSG_SPLINE_MOVE_ROOT
Definition Opcodes.h:824

References AddUnitMovementFlag(), Movement::MoveSpline::Finalized(), Object::GetPackGUID(), HasUnitState(), IsFalling(), Object::IsPlayer(), m_movedByPlayer, m_rootTimes, MOVEMENTFLAG_MASK_MOVING, MOVEMENTFLAG_PENDING_ROOT, MOVEMENTFLAG_ROOT, movespline, RemoveUnitMovementFlag(), Player::SendDirectMessage(), WorldObject::SendMessageToSet(), SMSG_FORCE_MOVE_ROOT, SMSG_FORCE_MOVE_UNROOT, SMSG_SPLINE_MOVE_ROOT, SMSG_SPLINE_MOVE_UNROOT, StopMoving(), StopMovingOnCurrentPos(), Object::ToPlayer(), and UNIT_STATE_STUNNED.

Referenced by WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), SetControlled(), and SetStunned().

◆ SetShapeshiftForm()

void Unit::SetShapeshiftForm ( ShapeshiftForm  form)
21119{
21121 sScriptMgr->OnUnitSetShapeshiftForm((Unit*)this, form);
21122}

References Object::SetByteValue(), sScriptMgr, and UNIT_FIELD_BYTES_2.

Referenced by AuraEffect::HandleAuraModShapeshift(), and reset_commandscript::HandleResetStatsOrLevelHelper().

◆ SetSheath()

◆ SetSpeed()

void Unit::SetSpeed ( UnitMoveType  mtype,
float  rate,
bool  forced = false 
)
14520{
14521 if (rate < 0)
14522 rate = 0.0f;
14523
14524 // Update speed only on change
14525 if (m_speed_rate[mtype] == rate)
14526 return;
14527
14528 m_speed_rate[mtype] = rate;
14529
14531
14532 WorldPacket data;
14533 if (!forced)
14534 {
14535 switch (mtype)
14536 {
14537 case MOVE_WALK:
14538 data.Initialize(MSG_MOVE_SET_WALK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14539 break;
14540 case MOVE_RUN:
14541 data.Initialize(MSG_MOVE_SET_RUN_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14542 break;
14543 case MOVE_RUN_BACK:
14544 data.Initialize(MSG_MOVE_SET_RUN_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14545 break;
14546 case MOVE_SWIM:
14547 data.Initialize(MSG_MOVE_SET_SWIM_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14548 break;
14549 case MOVE_SWIM_BACK:
14550 data.Initialize(MSG_MOVE_SET_SWIM_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14551 break;
14552 case MOVE_TURN_RATE:
14553 data.Initialize(MSG_MOVE_SET_TURN_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14554 break;
14555 case MOVE_FLIGHT:
14556 data.Initialize(MSG_MOVE_SET_FLIGHT_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14557 break;
14558 case MOVE_FLIGHT_BACK:
14559 data.Initialize(MSG_MOVE_SET_FLIGHT_BACK_SPEED, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14560 break;
14561 case MOVE_PITCH_RATE:
14562 data.Initialize(MSG_MOVE_SET_PITCH_RATE, 8 + 4 + 2 + 4 + 4 + 4 + 4 + 4 + 4 + 4);
14563 break;
14564 default:
14565 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14566 return;
14567 }
14568
14569 data << GetPackGUID();
14570 BuildMovementPacket(&data);
14571 data << float(GetSpeed(mtype));
14572 SendMessageToSet(&data, true);
14573 }
14574 else
14575 {
14576 if (IsPlayer())
14577 {
14578 // register forced speed changes for WorldSession::HandleForceSpeedChangeAck
14579 // and do it only for real sent packets and use run for run/mounted as client expected
14580 ++ToPlayer()->m_forced_speed_changes[mtype];
14581
14582 // Xinef: update speed of pet also
14583 if (!IsInCombat())
14584 {
14585 Unit* pet = ToPlayer()->GetPet();
14586 if (!pet)
14587 pet = GetCharm();
14588
14589 // xinef: do not affect vehicles and possesed pets
14590 if (pet && (pet->HasUnitFlag(UNIT_FLAG_POSSESSED) || pet->IsVehicle()))
14591 pet = nullptr;
14592
14593 if (pet && pet->IsCreature() && !pet->IsInCombat() && pet->GetMotionMaster()->GetCurrentMovementGeneratorType() == FOLLOW_MOTION_TYPE)
14594 pet->UpdateSpeed(mtype, forced);
14595 if (Unit* critter = ObjectAccessor::GetUnit(*this, GetCritterGUID()))
14596 critter->UpdateSpeed(mtype, forced);
14597 }
14598 ToPlayer()->SetCanTeleport(true);
14599 }
14600
14601 switch (mtype)
14602 {
14603 case MOVE_WALK:
14605 break;
14606 case MOVE_RUN:
14608 break;
14609 case MOVE_RUN_BACK:
14611 break;
14612 case MOVE_SWIM:
14614 break;
14615 case MOVE_SWIM_BACK:
14617 break;
14618 case MOVE_TURN_RATE:
14620 break;
14621 case MOVE_FLIGHT:
14623 break;
14624 case MOVE_FLIGHT_BACK:
14626 break;
14627 case MOVE_PITCH_RATE:
14629 break;
14630 default:
14631 LOG_ERROR("entities.unit", "Unit::SetSpeed: Unsupported move type ({}), data not sent to client.", mtype);
14632 return;
14633 }
14634 data << GetPackGUID();
14635 data << (uint32)0; // moveEvent, NUM_PMOVE_EVTS = 0x39
14636 if (mtype == MOVE_RUN)
14637 data << uint8(0); // new 2.1.0
14638 data << float(GetSpeed(mtype));
14639 SendMessageToSet(&data, true);
14640 }
14641}
@ FOLLOW_MOTION_TYPE
Definition MotionMaster.h:54
@ MOVE_TURN_RATE
Definition UnitDefines.h:354
@ MOVE_FLIGHT_BACK
Definition UnitDefines.h:356
@ MOVE_SWIM_BACK
Definition UnitDefines.h:353
@ MOVE_PITCH_RATE
Definition UnitDefines.h:357
@ MOVE_RUN_BACK
Definition UnitDefines.h:351
@ MOVE_WALK
Definition UnitDefines.h:349
MovementGeneratorType GetCurrentMovementGeneratorType() const
Definition MotionMaster.cpp:913
uint8 m_forced_speed_changes[MAX_MOVE_TYPE]
Definition Player.h:2415
float GetSpeed(UnitMoveType mtype) const
Definition Unit.cpp:14514
void propagateSpeedChange()
Definition Unit.h:1658
@ SMSG_FORCE_TURN_RATE_CHANGE
Definition Opcodes.h:764
@ MSG_MOVE_SET_SWIM_BACK_SPEED
Definition Opcodes.h:243
@ MSG_MOVE_SET_TURN_RATE
Definition Opcodes.h:246
@ SMSG_FORCE_WALK_SPEED_CHANGE
Definition Opcodes.h:760
@ SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE
Definition Opcodes.h:929
@ MSG_MOVE_SET_PITCH_RATE
Definition Opcodes.h:1145
@ SMSG_FORCE_RUN_SPEED_CHANGE
Definition Opcodes.h:256
@ SMSG_FORCE_SWIM_BACK_SPEED_CHANGE
Definition Opcodes.h:762
@ SMSG_FORCE_RUN_BACK_SPEED_CHANGE
Definition Opcodes.h:258
@ SMSG_FORCE_FLIGHT_SPEED_CHANGE
Definition Opcodes.h:927
@ SMSG_FORCE_SWIM_SPEED_CHANGE
Definition Opcodes.h:260
@ MSG_MOVE_SET_RUN_SPEED
Definition Opcodes.h:235
@ MSG_MOVE_SET_FLIGHT_SPEED
Definition Opcodes.h:924
@ MSG_MOVE_SET_WALK_SPEED
Definition Opcodes.h:239
@ MSG_MOVE_SET_SWIM_SPEED
Definition Opcodes.h:241
@ MSG_MOVE_SET_FLIGHT_BACK_SPEED
Definition Opcodes.h:926
@ SMSG_FORCE_PITCH_RATE_CHANGE
Definition Opcodes.h:1146
@ MSG_MOVE_SET_RUN_BACK_SPEED
Definition Opcodes.h:237

References BuildMovementPacket(), FOLLOW_MOTION_TYPE, GetCharm(), GetCritterGUID(), MotionMaster::GetCurrentMovementGeneratorType(), GetMotionMaster(), Object::GetPackGUID(), Player::GetPet(), GetSpeed(), ObjectAccessor::GetUnit(), HasUnitFlag(), WorldPacket::Initialize(), Object::IsCreature(), IsInCombat(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, Player::m_forced_speed_changes, m_speed_rate, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_PITCH_RATE, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_TURN_RATE, MOVE_WALK, MSG_MOVE_SET_FLIGHT_BACK_SPEED, MSG_MOVE_SET_FLIGHT_SPEED, MSG_MOVE_SET_PITCH_RATE, MSG_MOVE_SET_RUN_BACK_SPEED, MSG_MOVE_SET_RUN_SPEED, MSG_MOVE_SET_SWIM_BACK_SPEED, MSG_MOVE_SET_SWIM_SPEED, MSG_MOVE_SET_TURN_RATE, MSG_MOVE_SET_WALK_SPEED, propagateSpeedChange(), WorldObject::SendMessageToSet(), Player::SetCanTeleport(), SMSG_FORCE_FLIGHT_BACK_SPEED_CHANGE, SMSG_FORCE_FLIGHT_SPEED_CHANGE, SMSG_FORCE_PITCH_RATE_CHANGE, SMSG_FORCE_RUN_BACK_SPEED_CHANGE, SMSG_FORCE_RUN_SPEED_CHANGE, SMSG_FORCE_SWIM_BACK_SPEED_CHANGE, SMSG_FORCE_SWIM_SPEED_CHANGE, SMSG_FORCE_TURN_RATE_CHANGE, SMSG_FORCE_WALK_SPEED_CHANGE, Object::ToPlayer(), UNIT_FLAG_POSSESSED, and UpdateSpeed().

Referenced by Battleground::AddCreature(), boss_bug_trio::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), npc_spark_of_ionar::npc_spark_of_ionarAI::DoAction(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::DoAction(), npc_pet_dk_ebon_gargoyle::FlyAway(), boss_volkhan::boss_volkhanAI::GoToAnvil(), misc_commandscript::HandleDismountCommand(), spell_mount_check_aura::HandleEffectPeriodic(), boss_sartharion_tenebron::boss_sartharion_tenebronAI::HandleExtraEvent(), boss_sartharion_shadron::boss_sartharion_shadronAI::HandleExtraEvent(), boss_sartharion_vesperon::boss_sartharion_vesperonAI::HandleExtraEvent(), WorldSession::HandleForceSpeedChangeAck(), modify_commandscript::HandleModifyASpeedCommand(), modify_commandscript::HandleModifyMountCommand(), Creature::InitEntry(), boss_glob_of_viscidus::InitializeAI(), Guardian::InitStatsForLevel(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::IsSummonedBy(), boss_sartharion_dragonAI::JustEngagedWith(), boss_four_horsemen::boss_four_horsemenAI::JustEngagedWith(), boss_ichoron::boss_ichoronAI::JustSummoned(), boss_sartharion::boss_sartharionAI::JustSummoned(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::MountSelf(), boss_onyxia::MovementInform(), boss_bug_trio::MovementInform(), boss_volkhan::boss_volkhanAI::MovementInform(), boss_sindragosa::boss_sindragosaAI::MovementInform(), npc_akilzon_eagle::MovementInform(), npc_hor_leader_second::npc_hor_leader_secondAI::MoveToNextStopPoint(), npc_ancestral_wolf::npc_ancestral_wolfAI::npc_ancestral_wolfAI(), npc_batrider::npc_batrider(), npc_hallows_end_soh::npc_hallows_end_soh(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_vehicle_d16_propelled_delivery::npc_vehicle_d16_propelled_deliveryAI::PassengerBoarded(), npc_hover_disk::npc_hover_diskAI::PassengerBoarded(), npc_eastvale_peasent::PathEndReached(), SmartScript::ProcessAction(), boss_nightbane::Reset(), npc_zuljin_vortex::Reset(), boss_headless_horseman::Reset(), boss_onyxia::Reset(), boss_bug_trio::Reset(), boss_sartharion_dragonAI::Reset(), boss_sindragosa::boss_sindragosaAI::Reset(), npc_oculus_unstable_sphere::npc_oculus_unstable_sphereAI::Reset(), boss_volkhan::boss_volkhanAI::Reset(), boss_thorim_sif_blizzard::boss_thorim_sif_blizzardAI::Reset(), npc_wild_wyrm::npc_wild_wyrmAI::Reset(), npc_freed_protodrake::npc_freed_protodrakeAI::Reset(), npc_dream_fog::npc_dream_fogAI::ScheduleEvents(), npc_eastvale_peasent::SetData(), Battlefield::SpawnCreature(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UnMountSelf(), npc_akilzon_eagle::UpdateAI(), boss_onyxia::UpdateAI(), npc_rizzle_sprysprocket::npc_rizzle_sprysprocketAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), boss_yoggsaron_death_orb::boss_yoggsaron_death_orbAI::UpdateAI(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::UpdateAI(), npc_wild_wyrm::npc_wild_wyrmAI::UpdateAI(), npc_ulduar_mimiron_rocket::npc_ulduar_mimiron_rocketAI::UpdateAI(), UpdateSpeed(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetSpeedRate()

◆ SetStandFlags()

◆ SetStandState()

void Unit::SetStandState ( uint8  state)
16799{
16801
16802 if (IsStandState())
16804
16805 if (IsPlayer())
16806 {
16808 data << (uint8)state;
16809 ToPlayer()->GetSession()->SendPacket(&data);
16810 }
16811}
@ UNIT_BYTES_1_OFFSET_STAND_STATE
Definition UnitDefines.h:23
@ SMSG_STANDSTATE_UPDATE
Definition Opcodes.h:699

References AURA_INTERRUPT_FLAG_NOT_SEATED, Player::GetSession(), Object::IsPlayer(), IsStandState(), RemoveAurasWithInterruptFlags(), WorldSession::SendPacket(), Object::SetByteValue(), SMSG_STANDSTATE_UPDATE, Object::ToPlayer(), UNIT_BYTES_1_OFFSET_STAND_STATE, and UNIT_FIELD_BYTES_1.

Referenced by _ApplyAura(), boss_kologarn::boss_kologarnAI::boss_kologarnAI(), boss_twinemperorsAI::boss_twinemperorsAI(), boss_thekal::CheckPhaseTransition(), npc_ringo::npc_ringoAI::ClearFaint(), npc_kerlonian::npc_kerlonianAI::ClearSleeping(), CombatStart(), npc_vrykul_skeleton::DamageTaken(), boss_alar::DamageTaken(), boss_thekal::DamageTaken(), boss_shade_of_aran::DamageTaken(), boss_nightbane::DoAction(), boss_twinemperorsAI::DoAction(), npc_twilight_volunteer::DoAction(), boss_the_lurker_below::DoAction(), boss_leotheras_the_blind::DoAction(), npc_madrigosa::DoAction(), boss_illidan_stormrage::DoAction(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::DoAction(), npc_taretha::npc_tarethaAI::DoAction(), Spell::DoAllEffectOnTarget(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::DoNice(), boss_ahune::Emerge(), UtherBatteredHiltEvent::Execute(), SuckBackEvent::Execute(), boss_ahune::ExecuteEvent(), boss_ingvar_the_plunderer::FeignDeath(), WorldSession::HandleAlterAppearance(), WorldSession::HandleLogoutCancelOpcode(), WorldSession::HandleLogoutRequestOpcode(), WorldSession::HandleMovementOpcodes(), WorldSession::HandlePlayerLoginFromDB(), AuraEffect::HandleSpiritOfRedemption(), WorldSession::HandleStandStateChangeOpcode(), spell_q11322_q11317_the_cleansing::if(), DistractMovementGenerator::Initialize(), boss_felmyst::InitializeAI(), npc_ranshalla::npc_ranshallaAI::JustDidDialogueStep(), boss_kalecgos::JustEngagedWith(), boss_palehoof::boss_palehoofAI::JustReachedHome(), npc_massive_jormungar::npc_massive_jormungarAI::JustReachedHome(), npc_ferocious_rhino::npc_ferocious_rhinoAI::JustReachedHome(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::JustReachedHome(), npc_frenzied_worgen::npc_frenzied_worgenAI::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_yoggsaron_brain::boss_yoggsaron_brainAI::JustSummoned(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::JustSummoned(), boss_anubarak_trial::boss_anubarak_trialAI::MoveInLineOfSight(), boss_kologarn::boss_kologarnAI::MoveInLineOfSight(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::MoveInLineOfSight(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::MovementInform(), npc_twilight_volunteer::MovementInform(), boss_mr_smite::boss_mr_smiteAI::MovementInform(), npc_madrigosa::npc_madrigosa(), spell_love_is_in_the_air_romantic_picnic::OnApply(), boss_shade_of_aran::OnPowerUpdate(), npc_kernobee::OnQuestAccept(), npc_kerlonian::OnQuestAccept(), npc_gilthares::OnQuestAccept(), npc_ringo::OnQuestAccept(), npc_maghar_captive::OnQuestAccept(), npc_mootoo_the_younger::OnQuestAccept(), npc_bonker_togglevolt::OnQuestAccept(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::PhaseTransitionSpawns(), Spell::prepare(), PretendToDie(), boss_alar::PretendToDie(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_vaelastrasz::boss_vaelAI::Reset(), boss_mr_smite::boss_mr_smiteAI::Reset(), boss_kalecgos::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), npc_thrall_bfu::npc_thrall_bfuAI::Reset(), boss_thekal::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Reset(), npc_wizzlecrank_shredder::npc_wizzlecrank_shredderAI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_professor_putricide::boss_professor_putricideAI::Reset(), boss_the_lich_king::boss_the_lich_kingAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::Reset(), boss_illidan_stormrage::Reset(), boss_reliquary_of_souls::boss_reliquary_of_soulsAI::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), npc_unkor_the_ruthless::npc_unkor_the_ruthlessAI::Reset(), Resurrect(), boss_the_lurker_below::SchedulerPhaseOne(), boss_the_lurker_below::SchedulerPhaseTwo(), npc_ringo::npc_ringoAI::SetFaint(), npc_kurenai_captive::npc_kurenai_captiveAI::SetGUID(), SetInCombatState(), npc_kerlonian::npc_kerlonianAI::SetSleeping(), SetStunned(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_draenei_survivor::npc_draenei_survivorAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), advisor_baseAI::SpellHit(), npc_wild_wyrm::npc_wild_wyrmAI::SpellHit(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::StartEvent(), boss_felmyst::StartIntro(), boss_ahune::Submerge(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_eachother(), npc_commander_dawnforge::npc_commander_dawnforgeAI::Turn_to_Pathaleons_Image(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_a_special_surprise::npc_a_special_surpriseAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_corporal_keeshan::npc_corporal_keeshanAI::UpdateAI(), npc_varian_wrynn::npc_varian_wrynnAI::UpdateAI(), npc_thrall_bfu::npc_thrall_bfuAI::UpdateAI(), npc_forest_frog::UpdateAI(), npc_alexstraza_the_lifebinder::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), boss_professor_putricide::boss_professor_putricideAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), npc_vrykul_skeleton::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_tallhorn_stag::npc_tallhorn_stagAI::UpdateAI(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::UpdateEscortAI(), GameObject::Use(), and npc_ancestral_wolf::npc_ancestral_wolfAI::WaypointReached().

◆ SetStat()

void Unit::SetStat ( Stats  stat,
int32  val 
)
inline

◆ SetStunned()

void Unit::SetStunned ( bool  apply)
protected
18243{
18245 {
18246 return;
18247 }
18248
18249 if (apply)
18250 {
18251 SetTarget();
18253
18254 if (IsPlayer())
18255 {
18257 }
18258
18259 SetRooted(true, true);
18260
18261 CastStop();
18262 }
18263 else
18264 {
18265 if (IsAlive() && GetVictim())
18267
18268 if (IsCreature())
18269 {
18270 // don't remove UNIT_FLAG_STUNNED for pet when owner is mounted (disabled pet's interface)
18271 Unit* owner = GetOwner();
18272 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18274
18275 // Xinef: same for charmed npcs
18276 owner = GetCharmer();
18277 if (!owner || !owner->IsPlayer() || !owner->ToPlayer()->IsMounted())
18279 }
18280 else
18282
18283 if (!HasUnitState(UNIT_STATE_ROOT)) // prevent moving if it also has root effect
18284 {
18285 SetRooted(false, true);
18286 }
18287 }
18288}

References CastStop(), GetCharmer(), Object::GetGUID(), GetOwner(), GetVictim(), HasUnitState(), IsAlive(), Object::IsCreature(), IsMounted(), Object::IsPlayer(), RemoveUnitFlag(), SetRooted(), SetStandState(), SetTarget(), SetUnitFlag(), Object::ToPlayer(), UNIT_FLAG_STUNNED, UNIT_STAND_STATE_STAND, UNIT_STATE_IN_FLIGHT, and UNIT_STATE_ROOT.

Referenced by SetControlled().

◆ SetSwim()

bool Unit::SetSwim ( bool  enable)
virtual

◆ SetTarget()

virtual void Unit::SetTarget ( ObjectGuid  = ObjectGuid::Empty)
pure virtual

◆ SetTimedFacingToObject()

void Unit::SetTimedFacingToObject ( WorldObject object,
uint32  time 
)
Todo:
figure out under what conditions creature will move towards object instead of facing it where it currently is.
20390{
20391 // never face when already moving
20392 if (!IsStopped() || !time)
20393 return;
20394
20396 Movement::MoveSplineInit init(this);
20397 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
20398 init.SetFacing(GetAngle(object)); // when on transport, GetAngle will still return global coordinates (and angle) that needs transforming
20399 init.Launch();
20400
20401 if (Creature* c = ToCreature())
20402 c->m_Events.AddEvent(new ResetToHomeOrientation(*c), c->m_Events.CalculateTime(time));
20403 else
20404 LOG_ERROR("entities.unit", "Unit::SetTimedFacingToObject called on non-creature unit {}. This should never happen.", GetEntry());
20405}
Definition Unit.cpp:20126

References Position::GetAngle(), Object::GetEntry(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), IsStopped(), Movement::MoveSplineInit::Launch(), LOG_ERROR, Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and Object::ToCreature().

Referenced by spell_chapter5_return_to_capital::HandleHit().

◆ setTransForm()

void Unit::setTransForm ( uint32  spellid)
inline
1880{ m_transform = spellid;}

References m_transform.

Referenced by AuraEffect::HandleAuraTransform().

◆ SetUInt32Value()

void Unit::SetUInt32Value ( uint16  index,
uint32  value 
)
21180{
21181 Object::SetUInt32Value(index, value);
21182
21183 switch (index)
21184 {
21185 // Invalidating the cache on health change should fix an issue where the client sees dead NPCs when they are not.
21186 // We might also need to invalidate the cache for some other fields as well.
21187 case UNIT_FIELD_HEALTH:
21189 break;
21190 }
21191}
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:650
void InvalidateValuesUpdateCache()
Definition Unit.h:2140

References InvalidateValuesUpdateCache(), Object::SetUInt32Value(), and UNIT_FIELD_HEALTH.

Referenced by Player::_LoadDailyQuestStatus(), Player::_LoadSkills(), Player::AddItemToBuyBackSlot(), Attack(), Player::CheckAreaExploreAndOutdoor(), Spell::CheckItems(), Player::Create(), Pet::CreateBaseAtTamed(), Player::CreatePet(), Player::CreatePet(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), Dismount(), npc_harrison_jones::DoAction(), boss_thekal::DoAction(), boss_razuvious_minion::boss_razuvious_minionAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_pathaleon_the_calculator::DoAction(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::DoAction(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::DoAction(), boss_illidan_stormrage::DoAction(), Player::DuelComplete(), Spell::EffectSummonPet(), Spell::EffectTameCreature(), boss_jindo::EnterEvadeMode(), boss_zuljin::EnterPhase(), npc_unworthy_initiate::npc_unworthy_initiateAI::EventStart(), Player::GiveLevel(), Pet::GivePetLevel(), Pet::GivePetXP(), Player::GiveXP(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::HandleAnimation(), AuraEffect::HandleAuraDummy(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraTransform(), character_commandscript::HandleCharacterLevel(), debug_commandscript::HandleDebugMod32ValueCommand(), debug_commandscript::HandleDebugUpdateCommand(), spell_dk_dancing_rune_weapon_visual::HandleEffectApply(), spell_gen_model_visible::HandleEffectApply(), spell_gen_model_visible::HandleEffectRemove(), spell_gen_baby_murloc::HandleEffectRemove(), boss_ragnaros::boss_ragnarosAI::HandleEmerge(), misc_commandscript::HandleHideAreaCommand(), modify_commandscript::HandleModifyStandStateCommand(), modify_commandscript::HandleMorphMountCommand(), WorldSession::HandleMovementOpcodes(), AuraEffect::HandleNoReagentUseAura(), npc_commandscript::HandleNpcPlayEmoteCommand(), WorldSession::HandlePetRename(), reset_commandscript::HandleResetHonorCommand(), reset_commandscript::HandleResetLevelCommand(), reset_commandscript::HandleResetStatsOrLevelHelper(), WorldSession::HandleSelfResOpcode(), WorldSession::HandleSetTitleOpcode(), WorldSession::HandleSetWatchedFactionOpcode(), misc_commandscript::HandleShowAreaCommand(), WorldSession::HandleTextEmoteOpcode(), titles_commandscript::HandleTitlesCurrentCommand(), titles_commandscript::HandleTitlesRemoveCommand(), titles_commandscript::HandleTitlesSetMaskCommand(), Player::InitGlyphsForLevel(), npc_rabid_thistle_bear::npc_rabid_thistle_bearAI::Initialize(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::InitializeAI(), Player::InitStatsForLevel(), Guardian::InitStatsForLevel(), InitTamedPet(), npc_toc5_grand_champion_minion::npc_toc5_grand_champion_minionAI::JustDied(), boss_xt002::boss_xt002AI::JustEngagedWith(), npc_dragonflayer_forge_master::JustEngagedWith(), boss_jindo::JustEngagedWith(), npc_tirion_fordring_tft::npc_tirion_fordringAI::JustReachedHome(), npc_akama_illidan::JustReachedHome(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustSummoned(), npc_tirions_gambit_tirion::npc_tirions_gambit_tirionAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), Kill(), Creature::LoadCreaturesAddon(), Creature::LoadEquipment(), Player::LoadFromDB(), Pet::LoadPetFromDB(), WorldSession::LogoutPlayer(), Player::ModifySkillBonus(), Mount(), npc_icc_nerubar_broodkeeper::npc_icc_nerubar_broodkeeperAI::MoveInLineOfSight(), npc_harrison_jones::MovementInform(), boss_grand_champion::boss_grand_championAI::MovementInform(), boss_professor_putricide::boss_professor_putricideAI::MovementInform(), npc_tirion_fordring_tft::npc_tirion_fordringAI::MovementInform(), npc_akama_illidan::MovementInform(), npc_thassarian2::npc_thassarian2AI::MovementInform(), npc_apothecary_genericAI::MovementInform(), npc_pos_martin_or_gorkun_second::npc_pos_martin_or_gorkun_secondAI::npc_pos_martin_or_gorkun_secondAI(), spell_gen_clone_weapon_aura::OnApply(), instance_trial_of_the_champion::instance_trial_of_the_champion_InstanceMapScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), npc_ame::OnQuestAccept(), go_crystalline_tear::OnQuestAccept(), spell_gen_clone_weapon_aura::OnRemove(), npc_eastvale_peasent::PathEndReached(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), Player::RemoveAmmo(), Player::RemoveItemFromBuyBackSlot(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::ReorderInstance(), ReplaceAllDynamicFlags(), ReplaceAllNpcFlags(), Player::ReplaceAllPlayerFlags(), ReplaceAllUnitFlags(), ReplaceAllUnitFlags2(), boss_ragnaros::boss_ragnarosAI::Reset(), npc_unworthy_initiate::npc_unworthy_initiateAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_zuljin::Reset(), boss_arlokk::boss_arlokkAI::Reset(), boss_grand_champion::boss_grand_championAI::Reset(), npc_hor_leader::npc_hor_leaderAI::Reset(), boss_malygos::boss_malygosAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), npc_hidden_cultist::npc_hidden_cultistAI::Reset(), npc_thassarian2::npc_thassarian2AI::Reset(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::Reset(), npc_crusade_recruit::npc_crusade_recruitAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), Player::ResetDailyQuestStatus(), boss_razuvious_minion::boss_razuvious_minionAI::ScheduleAttackDummy(), Spell::SendChannelStart(), Spell::SendChannelUpdate(), Player::SetAmmo(), Player::SetArenaPoints(), Player::SetArenaTeamInfoField(), SetCharmedBy(), SetCreateHealth(), SetCreateMana(), Player::SetCurrentTitle(), Player::SetDailyQuestStatus(), npc_ulduar_vx001::npc_ulduar_vx001AI::SetData(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::SetData(), npc_eastvale_peasent::SetData(), setDeathState(), Player::setDeathState(), SetDisplayId(), SetEmoteState(), SetFaction(), Player::SetFreePrimaryProfessions(), Player::SetFreeTalentPoints(), Player::SetGlyph(), Player::SetGlyphSlot(), SetHealth(), Player::SetHonorPoints(), Player::SetInGuild(), SetLevel(), SetMaxHealth(), Player::SetMoney(), SetNativeDisplayId(), CharmInfo::SetPetNumber(), Player::SetQuestSlot(), Player::SetQuestSlotTimer(), Player::SetRank(), Player::SetRestBonus(), Player::SetSkill(), SetVirtualItem(), Player::SetVisibleItemSlot(), npc_injured_patient::npc_injured_patientAI::SpellHit(), npc_icc_valkyr_herald::npc_icc_valkyr_heraldAI::SpellHitTarget(), Map::SummonCreature(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SummonedCreatureDespawn(), Player::SummonPet(), Player::SwapQuestSlot(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::UpdateAI(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_partygoer_pather::UpdateAI(), npc_partygoer::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::UpdateAI(), npc_clintar_spirit::npc_clintar_spiritAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_hor_leader_second::npc_hor_leader_secondAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), npc_tirion_fordring_tft::npc_tirion_fordringAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), npc_ulduar_expedition_engineer::npc_ulduar_expedition_engineerAI::UpdateAI(), npc_thassarian2::npc_thassarian2AI::UpdateAI(), npc_amberpine_woodsman::npc_amberpine_woodsmanAI::UpdateAI(), npc_crusade_recruit::npc_crusade_recruitAI::UpdateAI(), npc_dragonmaw_peon::npc_dragonmaw_peonAI::UpdateAI(), Player::UpdateArmorPenetration(), Player::UpdateDuelFlag(), brann_bronzebeard::brann_bronzebeardAI::UpdateEscortAI(), Player::UpdateExpertise(), Player::UpdateHonorFields(), Player::UpdateRating(), Player::UpdateShieldBlockValue(), Player::UpdateSkill(), Player::UpdateSkillPro(), Player::UpdateSkillsForLevel(), Player::UpdateSkillsToMaxSkillsForLevel(), npc_black_knight_skeletal_gryphon::npc_black_knight_skeletal_gryphonAI::WaypointReached(), and npc_ranger_lilatha::WaypointReached().

◆ SetUnitFlag()

void Unit::SetUnitFlag ( UnitFlags  flags)
inline

UnitFlags available in UnitDefines.h.

703{ SetFlag(UNIT_FIELD_FLAGS, flags); }

References Object::SetFlag(), and UNIT_FIELD_FLAGS.

Referenced by BattlegroundAV::AddAVCreature(), Vehicle::AddPassenger(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::AddPortals(), Creature::AllLootRemovedFromCorpse(), npc_doctor::npc_doctorAI::BeginEvent(), boss_jarien::boss_jarien(), boss_sothos::boss_sothos(), GameObject::CastSpell(), Player::Create(), boss_apothecary_hummel::boss_apothecary_hummelAI::DamageTaken(), boss_muru::DamageTaken(), boss_jedoga_shadowseeker::DamageTaken(), boss_eadric::boss_eadricAI::DamageTaken(), boss_paletress::boss_paletressAI::DamageTaken(), boss_black_knight::boss_black_knightAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_frost_sphere::npc_frost_sphereAI::DamageTaken(), boss_bronjahm::boss_bronjahmAI::DamageTaken(), npc_terenas_menethil::npc_terenas_menethilAI::DamageTaken(), npc_crystalline_frayer::DamageTaken(), boss_algalon_the_observer::boss_algalon_the_observerAI::DamageTaken(), boss_freya::boss_freyaAI::DamageTaken(), boss_hodir::boss_hodirAI::DamageTaken(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::DamageTaken(), npc_ulduar_vx001::npc_ulduar_vx001AI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::DamageTaken(), boss_essence_of_suffering::boss_essence_of_sufferingAI::DamageTaken(), boss_essence_of_desire::boss_essence_of_desireAI::DamageTaken(), advisor_baseAI::DamageTaken(), boss_taerar::boss_taerarAI::DamageTaken(), npc_molten_golem::npc_molten_golemAI::DamageTaken(), boss_felblood_kaelthas::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), boss_mal_ganis::boss_mal_ganisAI::DamageTaken(), boss_thorim::boss_thorimAI::DamageTaken(), npc_q24545_wretched_ghoul::npc_q24545_wretched_ghoulAI::Deactivate(), DisableRotate(), boss_thorim::boss_thorimAI::DisableThorim(), boss_kirtonos_the_herald::boss_kirtonos_the_heraldAI::DoAction(), npc_amanishi_lookout::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_crok_scourgebane::npc_crok_scourgebaneAI::DoAction(), boss_algalon_the_observer::boss_algalon_the_observerAI::DoAction(), npc_frozen_core::DoAction(), boss_kalecgos::DoAction(), boss_grand_champion::boss_grand_championAI::DoAction(), boss_kelthuzad_minion::boss_kelthuzad_minionAI::DoAction(), npc_xt002_heart::npc_xt002_heartAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), boss_illidan_stormrage::DoAction(), PetAI::DoAttack(), FlightPathMovementGenerator::DoReset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::EnableSara(), boss_cyanigosa::boss_cyanigosaAI::EnterEvadeMode(), boss_erekem::boss_erekemAI::EnterEvadeMode(), boss_ichoron::boss_ichoronAI::EnterEvadeMode(), boss_lavanthor::boss_lavanthorAI::EnterEvadeMode(), boss_moragg::boss_moraggAI::EnterEvadeMode(), boss_xevozz::boss_xevozzAI::EnterEvadeMode(), boss_zuramat::boss_zuramatAI::EnterEvadeMode(), boss_anubarak_trial::boss_anubarak_trialAI::EnterEvadeMode(), boss_jaraxxus::boss_jaraxxusAI::EnterEvadeMode(), boss_gormok::boss_gormokAI::EnterEvadeMode(), boss_jormungarAI::EnterEvadeMode(), boss_icehowl::boss_icehowlAI::EnterEvadeMode(), SACDeactivateEvent::Execute(), boss_kaelthas::ExecuteMiddleEvent(), boss_ingvar_the_plunderer::FeignDeath(), spell_boss_magus_telestra_summon_telestra_clones_aura::HandleApply(), AuraEffect::HandleArenaPreparation(), AuraEffect::HandleAuraModFaction(), AuraEffect::HandleAuraModPacify(), AuraEffect::HandleAuraModSilence(), spell_q13007_iron_colossus::HandleDummy(), spell_herald_volzaj_insanity::HandleDummyEffect(), spell_gen_model_visible::HandleEffectApply(), spell_gen_feign_death_all_flags::HandleEffectApply(), spell_gen_feign_death_no_dyn_flag::HandleEffectApply(), spell_gen_feign_death_no_prevent_emotes::HandleEffectApply(), AuraEffect::HandleFeignDeath(), spell_chapter2_persuasive_strike::HandleHit(), BattlefieldWG::HandleKill(), Battleground::HandleKillPlayer(), WorldSession::HandleLogoutRequestOpcode(), spell_oculus_rider_aura::HandleOnEffectApply(), npc_echo_of_medivh::HandlePieceJustDied(), Battlefield::HideNpc(), npc_malchezaar_axe::Initialize(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::Initialize(), npc_scarlet_ghoul::npc_scarlet_ghoulAI::InitializeAI(), boss_kiljaeden::InitializeAI(), npc_general_andorov::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), Player::InitStatsForLevel(), boss_kologarn::boss_kologarnAI::JustDied(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustEngagedWith(), boss_mimiron::boss_mimironAI::JustEngagedWith(), boss_novos::boss_novosAI::JustEngagedWith(), boss_gothik::boss_gothikAI::JustEngagedWith(), boss_kelthuzad::boss_kelthuzadAI::JustEngagedWith(), npc_eris_hevenfire::npc_eris_hevenfireAI::JustSummoned(), boss_majordomo::boss_majordomoAI::JustSummoned(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::JustSummoned(), boss_hazzarah::JustSummoned(), boss_vaelastrasz::boss_vaelAI::JustSummoned(), npc_thrall_bfu::npc_thrall_bfuAI::JustSummoned(), boss_archimonde::JustSummoned(), boss_broggok::JustSummoned(), npc_varian_wrynn::npc_varian_wrynnAI::JustSummoned(), Mount(), npc_shattered_hand_scout::MoveInLineOfSight(), boss_kaelthas::MoveInLineOfSight(), npc_batrider::npc_batrider(), npc_blade_of_azzinoth::npc_blade_of_azzinoth(), npc_chess_move_trigger::npc_chess_move_trigger(), npc_hol_monument::npc_hol_monumentAI::npc_hol_monumentAI(), npc_mageguard_dalaran::npc_mageguard_dalaranAI::npc_mageguard_dalaranAI(), npc_pos_freed_slave::npc_pos_freed_slaveAI::npc_pos_freed_slaveAI(), npc_q24545_vegard::npc_q24545_vegardAI::npc_q24545_vegardAI(), npc_xt002_heart::npc_xt002_heartAI::npc_xt002_heartAI(), spell_halion_twilight_phasing_aura::OnApply(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), instance_sunken_temple::instance_sunken_temple_InstanceMapScript::OnCreatureCreate(), instance_dire_maul::instance_dire_maul_InstanceMapScript::OnCreatureCreate(), NPCStaveQuestAI::PrepareForEncounter(), PretendToDie(), boss_alar::PretendToDie(), Creature::RefreshSwimmingFlag(), boss_keristrasza::RemovePrison(), npc_grimstone::npc_grimstoneAI::Reset(), boss_pyroguard_emberseer::boss_pyroguard_emberseerAI::Reset(), boss_rend_blackhand::boss_rend_blackhandAI::Reset(), boss_nefarian::Reset(), boss_nightbane::Reset(), npc_death_knight_initiate::npc_death_knight_initiateAI::Reset(), npc_koltira_deathweaver::npc_koltira_deathweaverAI::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_kiljaeden::Reset(), npc_zuljin_vortex::Reset(), npc_hallows_end_soh::Reset(), npc_ancient_wisp::Reset(), boss_cthun::Reset(), npc_depth_charge::npc_depth_chargeAI::Reset(), npc_draenei_survivor::npc_draenei_survivorAI::Reset(), npc_injured_draenei::npc_injured_draeneiAI::Reset(), npc_death_ravager::npc_death_ravagerAI::Reset(), npc_giant_spotlight::npc_giant_spotlightAI::Reset(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::Reset(), boss_jedoga_shadowseeker::Reset(), boss_black_knight::boss_black_knightAI::Reset(), npc_announcer_toc5::npc_announcer_toc5AI::Reset(), boss_anubarak_trial::boss_anubarak_trialAI::Reset(), boss_novos::boss_novosAI::Reset(), boss_tyrannus::boss_tyrannusAI::Reset(), boss_drakkari_colossus::boss_drakkari_colossusAI::Reset(), boss_thaddius::boss_thaddiusAI::Reset(), boss_malygos::boss_malygosAI::Reset(), boss_eregos::boss_eregosAI::Reset(), boss_urom::boss_uromAI::Reset(), boss_varos::boss_varosAI::Reset(), boss_loken::boss_lokenAI::Reset(), boss_sjonnir::boss_sjonnirAI::Reset(), boss_flame_leviathan::boss_flame_leviathanAI::Reset(), npc_ulduar_iron_construct::npc_ulduar_iron_constructAI::Reset(), npc_ulduar_leviathan_mkii::npc_ulduar_leviathan_mkiiAI::Reset(), boss_palehoof::boss_palehoofAI::Reset(), npc_massive_jormungar::npc_massive_jormungarAI::Reset(), npc_ferocious_rhino::npc_ferocious_rhinoAI::Reset(), npc_ravenous_furbolg::npc_ravenous_furbolgAI::Reset(), npc_frenzied_worgen::npc_frenzied_worgenAI::Reset(), boss_ymiron::boss_ymironAI::Reset(), npc_drakuru_shackles::npc_drakuru_shacklesAI::Reset(), boss_shade_of_akama::Reset(), boss_leotheras_the_blind::Reset(), boss_the_lurker_below::Reset(), boss_warlord_kalithresh::Reset(), boss_broggok::Reset(), boss_kelidan_the_breaker::Reset(), boss_magtheridon::Reset(), boss_kaelthas::Reset(), npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::Reset(), npc_torloth_the_magnificent::npc_torloth_the_magnificentAI::Reset(), npc_injured_patient::npc_injured_patientAI::Reset(), instance_blood_furnace::instance_blood_furnace_InstanceMapScript::ResetPrisoner(), boss_the_lurker_below::SchedulerPhaseOne(), Player::SendLoot(), SetCharm(), SetCharmedBy(), SetImmuneToNPC(), SetImmuneToPC(), SetInCombatState(), Player::SetIsSpectator(), SetMinion(), SetStunned(), SetSwim(), boss_victor_nefarius::boss_victor_nefariusAI::sGossipSelect(), Battlefield::ShowNpc(), npc_netherspite_infernal::SpellHit(), npc_harrison_jones::SpellHit(), boss_valithria_dreamwalker::boss_valithria_dreamwalkerAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_wounded_skirmisher::SpellHit(), npc_venture_co_straggler::npc_venture_co_stragglerAI::SpellHit(), npc_nether_drake::npc_nether_drakeAI::SpellHit(), npc_injured_patient::npc_injured_patientAI::SpellHit(), boss_ionar::boss_ionarAI::Split(), boss_noth::boss_nothAI::StartBalconyPhase(), boss_lord_valthalak::boss_lord_valthalakAI::StartTalking(), npc_giant_claw_tentacle::Submerge(), boss_ouro::Submerge(), boss_ahune::Submerge(), boss_jedoga_shadowseeker::SummonedCreatureDies(), boss_vaelastrasz::boss_vaelAI::UpdateAI(), boss_ragnaros::boss_ragnarosAI::UpdateAI(), boss_mr_smite::boss_mr_smiteAI::UpdateAI(), npc_madrigosa::UpdateAI(), boss_arlokk::boss_arlokkAI::UpdateAI(), npc_twiggy_flathead::npc_twiggy_flatheadAI::UpdateAI(), boss_anub_arak::boss_anub_arakAI::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_anubarak_trial::boss_anubarak_trialAI::UpdateAI(), npc_nerubian_burrower::npc_nerubian_burrowerAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_krick::boss_krickAI::UpdateAI(), boss_drakkari_colossus::boss_drakkari_colossusAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), npc_cult_fanatic::npc_cult_fanaticAI::UpdateAI(), npc_cult_adherent::npc_cult_adherentAI::UpdateAI(), npc_terenas_menethil::npc_terenas_menethilAI::UpdateAI(), npc_blistering_zombie::npc_blistering_zombieAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_algalon_the_observer::boss_algalon_the_observerAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_xt002::boss_xt002AI::UpdateAI(), boss_ymiron::boss_ymironAI::UpdateAI(), npc_azure_saboteur::npc_azure_saboteurAI::UpdateAI(), npc_nether_drake::npc_nether_drakeAI::UpdateAI(), npc_artorius::npc_artoriusAI::UpdateAI(), npc_simone::npc_simoneAI::UpdateAI(), npc_nelson::npc_nelsonAI::UpdateAI(), npc_franklin::npc_franklinAI::UpdateAI(), npc_injured_patient::npc_injured_patientAI::UpdateAI(), boss_ichoron::boss_ichoronAI::UpdateAI(), and Creature::UpdateEntry().

◆ SetUnitFlag2()

◆ SetUnitMovementFlags()

◆ SetVirtualItem()

void Unit::SetVirtualItem ( uint32  slot,
uint32  itemId 
)
21033{
21034 if (slot >= MAX_EQUIPMENT_ITEMS)
21035 return;
21036
21038}

References MAX_EQUIPMENT_ITEMS, SetUInt32Value(), and UNIT_VIRTUAL_ITEM_SLOT_ID.

Referenced by ScriptedAI::SetEquipmentSlots().

◆ SetVisible()

void Unit::SetVisible ( bool  x)
14323{
14324 if (!x)
14326 else
14328
14330}
@ SEC_GAMEMASTER
Definition Common.h:59

References WorldObject::m_serverSideVisibility, SEC_GAMEMASTER, SEC_PLAYER, SERVERSIDE_VISIBILITY_GM, FlaggedValuesArray32< T_VALUES, T_FLAGS, FLAG_TYPE, ARRAY_SIZE >::SetValue(), and UpdateObjectVisibility().

Referenced by Creature::Create(), boss_muru::DamageTaken(), boss_alar::DamageTaken(), spell_rotface_unstable_ooze_explosion_suicide_aura::DespawnSelf(), boss_victor_nefarius::boss_victor_nefariusAI::DoAction(), boss_archimonde::DoAction(), boss_kalecgos::DoAction(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::DoAction(), boss_yoggsaron::boss_yoggsaronAI::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), HideNpcEvent::Execute(), UtherBatteredHiltEvent::Execute(), npc_anachronos_the_ancient::npc_anachronos_the_ancientAI::HandleAnimation(), BattlegroundSA::HandleKillUnit(), Battlefield::HideNpc(), boss_kiljaeden::InitializeAI(), boss_sapphiron::boss_sapphironAI::InitializeAI(), npc_xt002_heart::npc_xt002_heartAI::JustDied(), SmartAI::JustRespawned(), npc_highlord_darion_mograine::npc_highlord_darion_mograineAI::JustRespawned(), boss_hazzarah::JustSummoned(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::MoveInLineOfSight(), npc_enslaved_netherwing_drake::MovementInform(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::MovementInform(), boss_vazruden_the_herald::MovementInform(), npc_shattered_hand_scout::MovementInform(), npc_madrigosa::npc_madrigosa(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::npc_time_lost_proto_drakeAI(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::OnCreatureCreate(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::OnCreatureCreate(), instance_forge_of_souls::instance_forge_of_souls_InstanceScript::OnCreatureCreate(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_pit_of_saron::instance_pit_of_saron_InstanceScript::OnCreatureCreate(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::OnCreatureCreate(), npc_scarlet_miner_cart::npc_scarlet_miner_cartAI::PassengerBoarded(), boss_victor_nefarius::boss_victor_nefariusAI::Reset(), boss_midnight::Reset(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::Reset(), boss_darkmaster_gandling::boss_darkmaster_gandlingAI::Reset(), boss_muru::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::Reset(), boss_archimonde::Reset(), boss_eye_of_cthun::Reset(), npc_murkdeep::npc_murkdeepAI::Reset(), npc_anachronos_quest_trigger::npc_anachronos_quest_triggerAI::Reset(), boss_halion::boss_halionAI::Reset(), npc_pos_leader::npc_pos_leaderAI::Reset(), npc_blood_queen_lana_thel::npc_blood_queen_lana_thelAI::Reset(), boss_ionar::boss_ionarAI::Reset(), boss_yoggsaron_sara::boss_yoggsaron_saraAI::Reset(), npc_minigob_manabonk::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::Reset(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::Reset(), boss_vazruden_the_herald::Reset(), npc_enslaved_netherwing_drake::Reset(), npc_lord_illidan_stormrage::npc_lord_illidan_stormrageAI::Reset(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::SetData(), Battlefield::ShowNpc(), boss_ionar::boss_ionarAI::Split(), boss_warchief_kargath_bladefist::SummonedCreatureDies(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_madrigosa::UpdateAI(), npc_bh_thalorien_dawnseeker::npc_bh_thalorien_dawnseekerAI::UpdateAI(), npc_ravenclaw_apparition::npc_ravenclaw_apparitionAI::UpdateAI(), npc_arthas::npc_arthasAI::UpdateAI(), npc_murkdeep::npc_murkdeepAI::UpdateAI(), boss_halion::boss_halionAI::UpdateAI(), npc_hor_leader::npc_hor_leaderAI::UpdateAI(), npc_pos_leader::npc_pos_leaderAI::UpdateAI(), boss_sapphiron::boss_sapphironAI::UpdateAI(), boss_ionar::boss_ionarAI::UpdateAI(), npc_vh_teleportation_portal::npc_vh_teleportation_portalAI::UpdateAI(), npc_minigob_manabonk::UpdateAI(), npc_q24545_lich_king::npc_q24545_lich_kingAI::UpdateAI(), npc_overlord_drakuru_betrayal::npc_overlord_drakuru_betrayalAI::UpdateAI(), npc_commander_dawnforge::npc_commander_dawnforgeAI::UpdateAI(), SmartAI::UpdateDespawn(), npc_grimstone::npc_grimstoneAI::UpdateEscortAI(), npc_time_lost_proto_drake::npc_time_lost_proto_drakeAI::UpdateEscortAI(), npc_thrall_old_hillsbrad::npc_thrall_old_hillsbradAI::WaypointReached(), and npc_taretha::npc_tarethaAI::WaypointReached().

◆ SetVisibleAura()

void Unit::SetVisibleAura ( uint8  slot,
AuraApplication aur 
)
inline

◆ SetWalk()

bool Unit::SetWalk ( bool  enable)
virtual

Reimplemented in Creature.

20408{
20409 if (enable == IsWalking())
20410 return false;
20411
20412 if (enable)
20414 else
20416
20418 return true;
20419}

References AddUnitMovementFlag(), IsWalking(), MOVEMENTFLAG_WALKING, propagateSpeedChange(), and RemoveUnitMovementFlag().

Referenced by debug_commandscript::HandleDebugMoveflagsCommand(), SetCharm(), and Creature::SetWalk().

◆ SetWaterWalking()

bool Unit::SetWaterWalking ( bool  enable,
bool  packetOnly = false 
)
virtual

Allow to walk on water. Doesn't inform the client. Need to use SendMovementWaterWalking() if it's for players.

Reimplemented in Player, and Creature.

20487{
20489 return false;
20490
20491 if (enable)
20493 else
20495
20496 return true;
20497}
@ MOVEMENTFLAG_WATERWALKING
Definition UnitDefines.h:393

References AddUnitMovementFlag(), HasUnitMovementFlag(), MOVEMENTFLAG_WATERWALKING, and RemoveUnitMovementFlag().

Referenced by AuraEffect::HandleAuraWaterWalk(), debug_commandscript::HandleDebugMoveflagsCommand(), Player::SetWaterWalking(), and Creature::SetWaterWalking().

◆ SpellBaseDamageBonusDone()

int32 Unit::SpellBaseDamageBonusDone ( SpellSchoolMask  schoolMask)
12021{
12022 int32 DoneAdvertisedBenefit = 0;
12023
12025 for (AuraEffectList::const_iterator i = mDamageDone.begin(); i != mDamageDone.end(); ++i)
12026 if (((*i)->GetMiscValue() & schoolMask) != 0 &&
12027 (*i)->GetSpellInfo()->EquippedItemClass == -1 &&
12028 // -1 == any item class (not wand then)
12029 (*i)->GetSpellInfo()->EquippedItemInventoryTypeMask == 0)
12030 // 0 == any inventory type (not wand then)
12031 DoneAdvertisedBenefit += (*i)->GetAmount();
12032
12033 if (IsPlayer())
12034 {
12035 // Base value
12036 DoneAdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12037
12038 // Damage bonus from stats
12040 for (AuraEffectList::const_iterator i = mDamageDoneOfStatPercent.begin(); i != mDamageDoneOfStatPercent.end(); ++i)
12041 {
12042 if ((*i)->GetMiscValue() & schoolMask)
12043 {
12044 // stat used stored in miscValueB for this aura
12045 Stats usedStat = Stats((*i)->GetMiscValueB());
12046 DoneAdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12047 }
12048 }
12049 // ... and attack power
12051 for (AuraEffectList::const_iterator i = mDamageDonebyAP.begin(); i != mDamageDonebyAP.end(); ++i)
12052 if ((*i)->GetMiscValue() & schoolMask)
12053 DoneAdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12054 }
12055 return DoneAdvertisedBenefit;
12056}
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER
Definition SpellAuraDefines.h:300
@ SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT
Definition SpellAuraDefines.h:237
@ SPELL_AURA_MOD_DAMAGE_DONE
Definition SpellAuraDefines.h:76
uint32 GetBaseSpellPowerBonus()
Definition Player.h:1984

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_DAMAGE_DONE, SPELL_AURA_MOD_SPELL_DAMAGE_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_DAMAGE_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by spell_item_wraith_scythe_drain_life::CalculateDamage(), spell_mage_ice_barrier_aura::CalculateSpellAmount(), spell_mage_ice_barrier::CalculateSpellAmount(), Spell::EffectWeaponDmg(), spell_warl_life_tap::HandleDummy(), HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), SpellDamageBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseDamageBonusTaken()

int32 Unit::SpellBaseDamageBonusTaken ( SpellSchoolMask  schoolMask,
bool  isDoT = false 
)
12059{
12060 int32 TakenAdvertisedBenefit = 0;
12061
12063 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12064 if (((*i)->GetMiscValue() & schoolMask) != 0)
12065 {
12066 // Xinef: if we have DoT damage type and aura has charges, check if it affects DoTs
12067 // Xinef: required for hemorrhage & rupture / garrote
12068 if (isDoT && (*i)->GetBase()->IsUsingCharges() && !((*i)->GetSpellInfo()->ProcFlags & PROC_FLAG_TAKEN_PERIODIC))
12069 continue;
12070
12071 TakenAdvertisedBenefit += (*i)->GetAmount();
12072 }
12073
12074 return TakenAdvertisedBenefit;
12075}

References GetAuraEffectsByType(), PROC_FLAG_TAKEN_PERIODIC, and SPELL_AURA_MOD_DAMAGE_TAKEN.

Referenced by HandleDummyAuraProc(), spell_pal_seal_of_righteousness::HandleProc(), and SpellDamageBonusTaken().

◆ SpellBaseHealingBonusDone()

int32 Unit::SpellBaseHealingBonusDone ( SpellSchoolMask  schoolMask)
12786{
12787 int32 AdvertisedBenefit = 0;
12788
12790 for (AuraEffectList::const_iterator i = mHealingDone.begin(); i != mHealingDone.end(); ++i)
12791 if (!(*i)->GetMiscValue() || ((*i)->GetMiscValue() & schoolMask) != 0)
12792 AdvertisedBenefit += (*i)->GetAmount();
12793
12794 // Healing bonus of spirit, intellect and strength
12795 if (IsPlayer())
12796 {
12797 // Base value
12798 AdvertisedBenefit += ToPlayer()->GetBaseSpellPowerBonus();
12799
12800 // Healing bonus from stats
12802 for (AuraEffectList::const_iterator i = mHealingDoneOfStatPercent.begin(); i != mHealingDoneOfStatPercent.end(); ++i)
12803 {
12804 // stat used dependent from misc value (stat index)
12805 Stats usedStat = Stats((*i)->GetSpellInfo()->Effects[(*i)->GetEffIndex()].MiscValue);
12806 AdvertisedBenefit += int32(CalculatePct(GetStat(usedStat), (*i)->GetAmount()));
12807 }
12808
12809 // ... and attack power
12811 for (AuraEffectList::const_iterator i = mHealingDonebyAP.begin(); i != mHealingDonebyAP.end(); ++i)
12812 if ((*i)->GetMiscValue() & schoolMask)
12813 AdvertisedBenefit += int32(CalculatePct(GetTotalAttackPowerValue(BASE_ATTACK), (*i)->GetAmount()));
12814 }
12815 return AdvertisedBenefit;
12816}
@ SPELL_AURA_MOD_HEALING_DONE
Definition SpellAuraDefines.h:198
@ SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT
Definition SpellAuraDefines.h:238
@ SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER
Definition SpellAuraDefines.h:301

References BASE_ATTACK, CalculatePct(), GetAuraEffectsByType(), Player::GetBaseSpellPowerBonus(), GetStat(), GetTotalAttackPowerValue(), Object::IsPlayer(), SPELL_AURA_MOD_HEALING_DONE, SPELL_AURA_MOD_SPELL_HEALING_OF_ATTACK_POWER, SPELL_AURA_MOD_SPELL_HEALING_OF_STAT_PERCENT, and Object::ToPlayer().

Referenced by CalculateSpellAmount(), SpellHealingBonusDone(), lfg::LFGMgr::UpdateRaidBrowser(), and Player::UpdateSpellDamageAndHealingBonus().

◆ SpellBaseHealingBonusTaken()

int32 Unit::SpellBaseHealingBonusTaken ( SpellSchoolMask  schoolMask)
12819{
12820 int32 AdvertisedBenefit = 0;
12821
12823 for (AuraEffectList::const_iterator i = mDamageTaken.begin(); i != mDamageTaken.end(); ++i)
12824 if (((*i)->GetMiscValue() & schoolMask) != 0)
12825 AdvertisedBenefit += (*i)->GetAmount();
12826
12827 return AdvertisedBenefit;
12828}
@ SPELL_AURA_MOD_HEALING
Definition SpellAuraDefines.h:178

References GetAuraEffectsByType(), and SPELL_AURA_MOD_HEALING.

Referenced by SpellHealingBonusTaken().

◆ SpellCriticalDamageBonus()

uint32 Unit::SpellCriticalDamageBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12365{
12366 // Calculate critical bonus
12367 int32 crit_bonus = damage;
12368 float crit_mod = 0.0f;
12369
12370 switch (spellProto->DmgClass)
12371 {
12372 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12375 crit_bonus += damage;
12376 break;
12377 default:
12378 crit_bonus += damage / 2; // for spells is 50%
12379 break;
12380 }
12381
12382 if (caster)
12383 {
12384 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, spellProto->GetSchoolMask());
12385
12386 if (victim)
12387 crit_mod += caster->GetTotalAuraModifierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, victim->GetCreatureTypeMask());
12388
12389 if (crit_bonus != 0 && crit_mod != 0.0f)
12390 AddPct(crit_bonus, crit_mod);
12391
12392 crit_bonus -= damage;
12393
12394 // adds additional damage to critBonus (from talents)
12395 if (Player* modOwner = caster->GetSpellModOwner())
12396 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12397
12398 crit_bonus += damage;
12399 }
12400
12401 return crit_bonus;
12402}

References AddPct(), SpellInfo::DmgClass, GetCreatureTypeMask(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAuraModifierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_DAMAGE_BONUS, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by CalculateSpellDamageTaken(), AuraEffect::HandlePeriodicDamageAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellCriticalHealingBonus()

uint32 Unit::SpellCriticalHealingBonus ( Unit const *  caster,
SpellInfo const *  spellProto,
uint32  damage,
Unit const *  victim 
)
static
Todo:
: write here full calculation for melee/ranged spells
12405{
12406 // Calculate critical bonus
12407 int32 crit_bonus;
12408 switch (spellProto->DmgClass)
12409 {
12410 case SPELL_DAMAGE_CLASS_MELEE: // for melee based spells is 100%
12413 crit_bonus = damage;
12414 break;
12415 default:
12416 crit_bonus = damage / 2; // for spells is 50%
12417 break;
12418 }
12419
12420 if (caster)
12421 {
12422 if (victim)
12423 {
12424 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
12425 crit_bonus = int32(crit_bonus * caster->GetTotalAuraMultiplierByMiscMask(SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, creatureTypeMask));
12426 }
12427
12428 // adds additional damage to critBonus (from talents)
12429 // xinef: used for death knight death coil
12430 if (Player* modOwner = caster->GetSpellModOwner())
12431 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRIT_DAMAGE_BONUS, crit_bonus);
12432 }
12433
12434 if (crit_bonus > 0)
12435 damage += crit_bonus;
12436
12437 if (caster)
12438 damage = int32(float(damage) * caster->GetTotalAuraMultiplier(SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT));
12439
12440 return damage;
12441}
@ SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT
Definition SpellAuraDefines.h:113

References SpellInfo::DmgClass, GetCreatureTypeMask(), GetSpellModOwner(), GetTotalAuraMultiplier(), GetTotalAuraMultiplierByMiscMask(), SpellInfo::Id, SPELL_AURA_MOD_CRIT_PERCENT_VERSUS, SPELL_AURA_MOD_CRITICAL_HEALING_AMOUNT, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_RANGED, and SPELLMOD_CRIT_DAMAGE_BONUS.

Referenced by Spell::DoAllEffectOnTarget(), and AuraEffect::HandlePeriodicHealAurasTick().

◆ SpellDamageBonusDone()

uint32 Unit::SpellDamageBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
11699{
11700 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11701 return pdamage;
11702
11703 // Some spells don't benefit from done mods
11704 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11705 return pdamage;
11706
11707 // For totems get damage bonus from owner
11708 if (IsCreature())
11709 {
11710 if (IsTotem())
11711 {
11712 if (Unit* owner = GetOwner())
11713 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, effIndex, TotalMod, stack);
11714 }
11715 // Dancing Rune Weapon...
11716 else if (GetEntry() == 27893)
11717 {
11718 if (Unit* owner = GetOwner())
11719 return owner->SpellDamageBonusDone(victim, spellProto, pdamage, damagetype, TotalMod, stack) / 2;
11720 }
11721 }
11722
11723 // Done total percent damage auras
11724 float ApCoeffMod = 1.0f;
11725 int32 DoneTotal = 0;
11726 float DoneTotalMod = TotalMod ? TotalMod : SpellPctDamageModsDone(victim, spellProto, damagetype);
11727
11728 // Config : RATE_CREATURE_X_SPELLDAMAGE & Do Not Modify Pet/Guardian/Mind Controlled Damage
11730 DoneTotalMod *= ToCreature()->GetSpellDamageMod(ToCreature()->GetCreatureTemplate()->rank);
11731
11732 // Some spells don't benefit from pct done mods
11733 if (!spellProto->HasAttribute(SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS))
11734 {
11735 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11736 // Add flat bonus from spell damage versus
11738 }
11739
11740 // done scripted mod (take it from owner)
11741 Unit* owner = GetOwner() ? GetOwner() : this;
11742 int32 DoneAdvertisedBenefit = 0;
11743 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11744 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11745 {
11746 if (!(*i)->IsAffectedOnSpell(spellProto))
11747 continue;
11748
11749 switch ((*i)->GetMiscValue())
11750 {
11751 case 4418: // Increased Shock Damage
11752 case 4554: // Increased Lightning Damage
11753 case 4555: // Improved Moonfire
11754 case 5142: // Increased Lightning Damage
11755 case 5147: // Improved Consecration / Libram of Resurgence
11756 case 5148: // Idol of the Shooting Star
11757 case 6008: // Increased Lightning Damage
11758 case 8627: // Totem of Hex
11759 {
11760 DoneAdvertisedBenefit += (*i)->GetAmount();
11761 break;
11762 }
11763 }
11764 }
11765
11766 // Custom scripted damage
11767 switch (spellProto->SpellFamilyName)
11768 {
11769 case SPELLFAMILY_DRUID:
11770 {
11771 // Insect Swarm vs Item - Druid T8 Balance Relic
11772 if (spellProto->SpellFamilyFlags[0] & 0x00200000)
11773 {
11774 if (AuraEffect const* relicAurEff = GetAuraEffect(64950, EFFECT_0))
11775 {
11776 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11777 }
11778 }
11779
11780 // Nourish vs Idol of the Flourishing Life
11781 if (spellProto->SpellFamilyFlags[1] & 0x02000000)
11782 {
11783 if (AuraEffect const* relicAurEff = GetAuraEffect(64949, EFFECT_0))
11784 {
11785 DoneAdvertisedBenefit += relicAurEff->GetAmount();
11786 }
11787 }
11788 break;
11789 }
11791 {
11792 // Sigil of the Vengeful Heart
11793 if (spellProto->SpellFamilyFlags[0] & 0x2000)
11794 {
11795 if (AuraEffect* aurEff = GetAuraEffect(64962, EFFECT_1))
11796 {
11797 AddPct(DoneTotal, aurEff->GetAmount());
11798 }
11799 }
11800
11801 // Impurity
11803 {
11804 AddPct(ApCoeffMod, aurEff->GetAmount());
11805 }
11806
11807 // Blood Boil - bonus for diseased targets
11808 if ((spellProto->SpellFamilyFlags[0] & 0x00040000) && victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DEATHKNIGHT, 0, 0, 0x00000002, GetGUID()))
11809 {
11810 DoneTotal += 95;
11811 ApCoeffMod = 1.5835f;
11812 }
11813 break;
11814 }
11815 default:
11816 break;
11817 }
11818
11819 // Done fixed damage bonus auras
11820 DoneAdvertisedBenefit += SpellBaseDamageBonusDone(spellProto->GetSchoolMask());
11821
11822 // Check for table values
11823 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
11824 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11825 if (bonus)
11826 {
11827 if (damagetype == DOT)
11828 {
11829 coeff = bonus->dot_damage;
11830 if (bonus->ap_dot_bonus > 0)
11831 {
11832 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11834 APbonus += GetTotalAttackPowerValue(attType);
11835 DoneTotal += int32(bonus->ap_dot_bonus * stack * ApCoeffMod * APbonus);
11836 }
11837 }
11838 else
11839 {
11840 coeff = bonus->direct_damage;
11841 if (bonus->ap_bonus > 0)
11842 {
11843 WeaponAttackType attType = (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK;
11845 APbonus += GetTotalAttackPowerValue(attType);
11846 DoneTotal += int32(bonus->ap_bonus * stack * ApCoeffMod * APbonus);
11847 }
11848 }
11849 }
11850
11851 // Default calculation
11852 if (coeff && DoneAdvertisedBenefit)
11853 {
11854 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11855
11856 if (Player* modOwner = GetSpellModOwner())
11857 {
11858 coeff *= 100.0f;
11859 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
11860 coeff /= 100.0f;
11861 }
11862
11863 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
11864 }
11865
11866 float tmpDamage = (float(pdamage) + DoneTotal) * DoneTotalMod;
11867 // apply spellmod to Done damage (flat and pct)
11868 if (Player* modOwner = GetSpellModOwner())
11869 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, tmpDamage);
11870
11871 return uint32(std::max(tmpDamage, 0.0f));
11872}
@ SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS
Definition SharedDefines.h:633
@ SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS
Definition SpellAuraDefines.h:243
@ SPELLMOD_DOT
Definition SpellDefines.h:98
@ SPELLMOD_BONUS_MULTIPLIER
Definition SpellDefines.h:100
float GetSpellDamageMod(int32 Rank)
Definition Creature.cpp:1622
float SpellPctDamageModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:11367
float CalculateLevelPenalty(SpellInfo const *spellProto) const
Definition Unit.cpp:3068
Definition SpellMgr.h:324
float ap_dot_bonus
Definition SpellMgr.h:328
float dot_damage
Definition SpellMgr.h:326
float ap_bonus
Definition SpellMgr.h:327
float direct_damage
Definition SpellMgr.h:325

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, EFFECT_0, EFFECT_1, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), GetOwner(), SpellInfo::GetSchoolMask(), Creature::GetSpellDamageMod(), GetSpellModOwner(), GetTotalAttackPowerValue(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, IsControlledByPlayer(), Object::IsCreature(), IsGuardian(), IsPet(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), RANGED_ATTACK, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_CASTER_DAMAGE_MODIFIERS, SPELL_AURA_MELEE_ATTACK_POWER_ATTACKER_BONUS, SPELL_AURA_MOD_FLAT_SPELL_DAMAGE_VERSUS, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_RANGED_ATTACK_POWER_ATTACKER_BONUS, SPELL_DAMAGE_CLASS_MELEE, SpellBaseDamageBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctDamageModsDone(), sSpellMgr, and Object::ToCreature().

Referenced by spell_warl_seed_of_corruption_aura::CalculateAmount(), AuraEffect::CalculateAmount(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), spell_warr_bloodthirst::HandleDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandleProcTriggerDamageAuraProc().

◆ SpellDamageBonusTaken()

uint32 Unit::SpellDamageBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  pdamage,
DamageEffectType  damagetype,
uint32  stack = 1 
)
11875{
11876 if (!spellProto || damagetype == DIRECT_DAMAGE)
11877 return pdamage;
11878
11879 int32 TakenTotal = 0;
11880 float TakenTotalMod = 1.0f;
11881
11882 // from positive and negative SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN
11883 // multiplicative bonus, for example Dispersion + Shadowform (0.10*0.85=0.085)
11885 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
11886 if (((*i)->GetMiscValue() & spellProto->GetSchoolMask()))
11887 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11888 AddPct(TakenTotalMod, (*i)->GetAmount());
11889
11890 TakenTotalMod = processDummyAuras(TakenTotalMod);
11891
11892 // From caster spells
11893 if (caster)
11894 {
11896 for (AuraEffectList::const_iterator i = mOwnerTaken.begin(); i != mOwnerTaken.end(); ++i)
11897 if ((*i)->GetCasterGUID() == caster->GetGUID() && (*i)->IsAffectedOnSpell(spellProto))
11898 if (spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11899 AddPct(TakenTotalMod, (*i)->GetAmount());
11900 }
11901
11902 if (uint32 mechanicMask = spellProto->GetAllEffectsMechanicMask())
11903 {
11904 int32 modifierMax = 0;
11905 int32 modifierMin = 0;
11907 for (AuraEffectList::const_iterator i = auraEffectList.begin(); i != auraEffectList.end(); ++i)
11908 {
11909 if (!spellProto->ValidateAttribute6SpellDamageMods(caster, *i, damagetype == DOT))
11910 continue;
11911
11912 // Only death knight spell with this aura
11913 if ((*i)->GetSpellInfo()->SpellFamilyName == SPELLFAMILY_DEATHKNIGHT)
11914 if (!caster || caster->GetGUID() != (*i)->GetCasterGUID())
11915 continue;
11916
11917 if (mechanicMask & uint32(1 << (*i)->GetMiscValue()))
11918 {
11919 if ((*i)->GetAmount() > 0)
11920 {
11921 if ((*i)->GetAmount() > modifierMax)
11922 modifierMax = (*i)->GetAmount();
11923 }
11924 else if ((*i)->GetAmount() < modifierMin)
11925 modifierMin = (*i)->GetAmount();
11926 }
11927 }
11928
11929 AddPct(TakenTotalMod, modifierMax);
11930 AddPct(TakenTotalMod, modifierMin);
11931 }
11932
11933 int32 TakenAdvertisedBenefit = SpellBaseDamageBonusTaken(spellProto->GetSchoolMask(), damagetype == DOT);
11934
11935 // Check for table values
11936 float coeff = 0;
11937 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
11938 if (bonus)
11939 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
11940
11941 // Default calculation
11942 if (TakenAdvertisedBenefit)
11943 {
11944 if (coeff <= 0.0f)
11945 {
11946 if (caster)
11947 coeff = caster->CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11948 else
11949 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack);
11950 }
11951
11952 float factorMod = CalculateLevelPenalty(spellProto) * stack;
11953 TakenTotal += int32(TakenAdvertisedBenefit * coeff * factorMod);
11954 }
11955
11956 // No positive taken bonus, custom attr
11957 if (spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS) && TakenTotalMod > 1.0f)
11958 {
11959 TakenTotal = 0;
11960 TakenTotalMod = 1.0f;
11961 }
11962
11963 // xinef: sanctified wrath talent
11964 if (caster && TakenTotalMod < 1.0f && caster->HasIgnoreTargetResistAura())
11965 {
11966 float ignoreModifier = 1.0f - TakenTotalMod;
11967 bool addModifier = false;
11969 for (AuraEffectList::const_iterator j = ResIgnoreAuras.begin(); j != ResIgnoreAuras.end(); ++j)
11970 if ((*j)->GetMiscValue() & spellProto->SchoolMask)
11971 {
11972 ApplyPct(ignoreModifier, (*j)->GetAmount());
11973 addModifier = true;
11974 }
11975
11976 if (addModifier)
11977 TakenTotalMod += ignoreModifier;
11978 }
11979
11980 float tmpDamage = (float(pdamage) + TakenTotal) * TakenTotalMod;
11981
11982 return uint32(std::max(tmpDamage, 0.0f));
11983}
float CalculateDefaultCoefficient(SpellInfo const *spellInfo, DamageEffectType damagetype) const
Definition Unit.cpp:17268

References AddPct(), ApplyPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), DIRECT_DAMAGE, SpellBonusEntry::direct_damage, DOT, SpellBonusEntry::dot_damage, SpellInfo::GetAllEffectsMechanicMask(), GetAuraEffectsByType(), Object::GetGUID(), SpellInfo::GetSchoolMask(), SpellInfo::HasAttribute(), HasIgnoreTargetResistAura(), SpellInfo::Id, processDummyAuras(), SpellInfo::SchoolMask, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_AURA_MOD_DAMAGE_FROM_CASTER, SPELL_AURA_MOD_DAMAGE_PERCENT_TAKEN, SPELL_AURA_MOD_IGNORE_TARGET_RESIST, SPELL_AURA_MOD_MECHANIC_DAMAGE_TAKEN_PERCENT, SpellBaseDamageBonusTaken(), SPELLFAMILY_DEATHKNIGHT, sSpellMgr, and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by DealMeleeDamage(), Spell::EffectHealthLeech(), Spell::EffectPowerDrain(), Spell::EffectSchoolDMG(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), AuraEffect::HandleProcTriggerDamageAuraProc(), and spell_black_temple_l5_arcane_charge::PrepareSpellScript().

◆ SpellDoneCritChance()

float Unit::SpellDoneCritChance ( Unit const *  ,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
12078{
12079 // Mobs can't crit with spells.
12080 if (IsCreature() && !GetSpellModOwner())
12081 return -100.0f;
12082
12083 // not critting spell
12084 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12085 return 0.0f;
12086
12087 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12088 if (!skipEffectCheck && !spellProto->IsCritCapable())
12089 return 0.0f;
12090
12091 float crit_chance = 0.0f;
12092 switch (spellProto->DmgClass)
12093 {
12095 {
12096 if (schoolMask & SPELL_SCHOOL_MASK_NORMAL)
12097 crit_chance = 0.0f;
12098 // For other schools
12099 else if (IsPlayer())
12100 crit_chance = GetFloatValue(static_cast<uint16>(PLAYER_SPELL_CRIT_PERCENTAGE1) + GetFirstSchoolInMask(schoolMask));
12101 else
12102 {
12103 crit_chance = (float)m_baseSpellCritChance;
12105 }
12106 break;
12107 }
12110 {
12111 if (IsPlayer())
12112 {
12113 switch (attackType)
12114 {
12115 case BASE_ATTACK:
12117 break;
12118 case OFF_ATTACK:
12120 break;
12121 case RANGED_ATTACK:
12123 break;
12124 default:
12125 break;
12126 }
12127 }
12128 else
12129 {
12130 crit_chance = 5.0f;
12133 }
12135 break;
12136 }
12137 // values overridden in spellmgr for lifebloom and earth shield
12139 default:
12140 return 0.0f;
12141 }
12142
12143 // percent done
12144 // only players use intelligence for critical chance computations
12145 if (Player* modOwner = GetSpellModOwner())
12146 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_CRITICAL_CHANCE, crit_chance);
12147
12148 // xinef: can be negative!
12149 return crit_chance;
12150}
@ SPELL_ATTR2_CANT_CRIT
Definition SharedDefines.h:485
@ SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL
Definition SpellAuraDefines.h:134
@ SPELLMOD_CRITICAL_CHANCE
Definition SpellDefines.h:83
@ PLAYER_SPELL_CRIT_PERCENTAGE1
Definition UpdateFields.h:354

References BASE_ATTACK, SpellInfo::DmgClass, GetFirstSchoolInMask(), Object::GetFloatValue(), GetSpellModOwner(), GetTotalAuraModifier(), GetTotalAuraModifierByMiscMask(), SpellInfo::HasAttribute(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsCritCapable(), Object::IsPlayer(), m_baseSpellCritChance, OFF_ATTACK, PLAYER_CRIT_PERCENTAGE, PLAYER_OFFHAND_CRIT_PERCENTAGE, PLAYER_RANGED_CRIT_PERCENTAGE, PLAYER_SPELL_CRIT_PERCENTAGE1, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_CRIT_PCT, SPELL_AURA_MOD_SPELL_CRIT_CHANCE_SCHOOL, SPELL_AURA_MOD_WEAPON_CRIT_PERCENT, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_SCHOOL_MASK_NORMAL, and SPELLMOD_CRITICAL_CHANCE.

Referenced by Spell::DoAllEffectOnLaunchTarget().

◆ SpellHealingBonusDone()

uint32 Unit::SpellHealingBonusDone ( Unit victim,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint8  effIndex,
float  TotalMod = 0.0f,
uint32  stack = 1 
)
12536{
12537 // For totems get healing bonus from owner (statue isn't totem in fact)
12538 if (IsCreature() && IsTotem())
12539 if (Unit* owner = GetOwner())
12540 return owner->SpellHealingBonusDone(victim, spellProto, healamount, damagetype, effIndex, TotalMod, stack);
12541
12542 // No bonus healing for potion spells
12543 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12544 return healamount;
12545
12546 float ApCoeffMod = 1.0f;
12547 float DoneTotalMod = TotalMod ? TotalMod : SpellPctHealingModsDone(victim, spellProto, damagetype);
12548 int32 DoneTotal = 0;
12549
12550 // done scripted mod (take it from owner)
12551 Unit* owner = GetOwner() ? GetOwner() : this;
12552 int32 DoneAdvertisedBenefit = 0;
12553 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12554 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12555 {
12556 if (!(*i)->IsAffectedOnSpell(spellProto))
12557 continue;
12558
12559 switch ((*i)->GetMiscValue())
12560 {
12561 case 4415: // Increased Rejuvenation Healing
12562 case 4953:
12563 DoneAdvertisedBenefit += (*i)->GetAmount();
12564 break;
12565 case 3736: // Hateful Totem of the Third Wind / Increased Lesser Healing Wave / LK Arena (4/5/6) Totem of the Third Wind / Savage Totem of the Third Wind
12566 DoneAdvertisedBenefit += (*i)->GetAmount();
12567 break;
12568 }
12569 }
12570
12571 switch (spellProto->SpellFamilyName)
12572 {
12574 {
12575 // Impurity
12577 {
12578 AddPct(ApCoeffMod, aurEff->GetAmount());
12579 }
12580 break;
12581 }
12582 default:
12583 break;
12584 }
12585
12586 // Done fixed damage bonus auras
12587 DoneAdvertisedBenefit += SpellBaseHealingBonusDone(spellProto->GetSchoolMask());
12588 float coeff = spellProto->Effects[effIndex].BonusMultiplier;
12589
12590 // Check for table values
12591 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12592 if (bonus)
12593 {
12594 if (damagetype == DOT)
12595 {
12596 coeff = bonus->dot_damage;
12597 if (bonus->ap_dot_bonus > 0)
12598 DoneTotal += int32(bonus->ap_dot_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12599 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12600 }
12601 else
12602 {
12603 coeff = bonus->direct_damage;
12604 if (bonus->ap_bonus > 0)
12605 DoneTotal += int32(bonus->ap_bonus * ApCoeffMod * stack * GetTotalAttackPowerValue(
12606 (spellProto->IsRangedWeaponSpell() && spellProto->DmgClass != SPELL_DAMAGE_CLASS_MELEE) ? RANGED_ATTACK : BASE_ATTACK));
12607 }
12608 }
12609 else
12610 {
12611 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12612 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12613 return healamount;
12614 }
12615
12616 // Default calculation
12617 if (DoneAdvertisedBenefit)
12618 {
12619 float factorMod = CalculateLevelPenalty(spellProto) * stack;
12620 if (Player* modOwner = GetSpellModOwner())
12621 {
12622 coeff *= 100.0f;
12623 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12624 coeff /= 100.0f;
12625 }
12626 DoneTotal += int32(DoneAdvertisedBenefit * coeff * factorMod);
12627 }
12628
12629 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12630 {
12631 switch (spellProto->Effects[i].ApplyAuraName)
12632 {
12633 // Bonus healing does not apply to these spells
12636 DoneTotal = 0;
12637 break;
12638 }
12639 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12640 DoneTotal = 0;
12641 }
12642
12643 // use float as more appropriate for negative values and percent applying
12644 float heal = float(int32(healamount) + DoneTotal) * DoneTotalMod;
12645 // apply spellmod to Done amount
12646
12647 if (Player* modOwner = GetSpellModOwner())
12648 modOwner->ApplySpellMod(spellProto->Id, damagetype == DOT ? SPELLMOD_DOT : SPELLMOD_DAMAGE, heal);
12649
12650 return uint32(std::max(heal, 0.0f));
12651}
@ SPELL_AURA_PERIODIC_HEALTH_FUNNEL
Definition SpellAuraDefines.h:125
int32 SpellBaseHealingBonusDone(SpellSchoolMask schoolMask)
Definition Unit.cpp:12785
float SpellPctHealingModsDone(Unit *victim, SpellInfo const *spellProto, DamageEffectType damagetype)
Definition Unit.cpp:12443

References AddPct(), SpellBonusEntry::ap_bonus, SpellBonusEntry::ap_dot_bonus, BASE_ATTACK, CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), GetTotalAttackPowerValue(), SpellInfo::Id, Object::IsCreature(), SpellInfo::IsRangedWeaponSpell(), IsTotem(), MAX_SPELL_EFFECTS, RANGED_ATTACK, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusDone(), SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_POTION, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, SPELLMOD_DAMAGE, SPELLMOD_DOT, SpellPctHealingModsDone(), and sSpellMgr.

Referenced by AuraEffect::CalculateAmount(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_dru_lifebloom::HandleDispel(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHealingBonusTaken()

uint32 Unit::SpellHealingBonusTaken ( Unit caster,
SpellInfo const *  spellProto,
uint32  healamount,
DamageEffectType  damagetype,
uint32  stack = 1 
)
12654{
12655 float TakenTotalMod = 1.0f;
12656 float minval = 0.0f;
12657
12658 // Healing taken percent
12659 if (!sScriptMgr->OnSpellHealingBonusTakenNegativeModifiers(this, caster, spellProto, minval))
12660 {
12662 }
12663
12664 if (minval)
12665 AddPct(TakenTotalMod, minval);
12666
12668 if (maxval)
12669 AddPct(TakenTotalMod, maxval);
12670
12671 // Tenacity increase healing % taken
12672 if (AuraEffect const* Tenacity = GetAuraEffect(58549, 0))
12673 AddPct(TakenTotalMod, Tenacity->GetAmount());
12674
12675 // Healing Done
12676 int32 TakenTotal = 0;
12677
12678 // Taken fixed damage bonus auras
12679 int32 TakenAdvertisedBenefit = SpellBaseHealingBonusTaken(spellProto->GetSchoolMask());
12680
12681 // Nourish cast, glyph of nourish
12682 if (spellProto->SpellFamilyName == SPELLFAMILY_DRUID && spellProto->SpellFamilyFlags[1] & 0x2000000 && caster)
12683 {
12684 bool any = false;
12685 bool hasglyph = caster->GetAuraEffectDummy(62971);
12687 for (AuraEffectList::const_iterator i = auras.begin(); i != auras.end(); ++i)
12688 {
12689 if (((*i)->GetCasterGUID() == caster->GetGUID()))
12690 {
12691 SpellInfo const* spell = (*i)->GetSpellInfo();
12692 // Rejuvenation, Regrowth, Lifebloom, or Wild Growth
12693 if (!any && spell->SpellFamilyFlags.HasFlag(0x50, 0x4000010, 0))
12694 {
12695 TakenTotalMod *= 1.2f;
12696 any = true;
12697 }
12698
12699 if (hasglyph)
12700 TakenTotalMod += 0.06f;
12701 }
12702 }
12703 }
12704
12705 if (damagetype == DOT)
12706 {
12707 // Healing over time taken percent
12708 float minval_hot = float(GetMaxNegativeAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12709 if (minval_hot)
12710 AddPct(TakenTotalMod, minval_hot);
12711
12712 float maxval_hot = float(GetMaxPositiveAuraModifier(SPELL_AURA_MOD_HOT_PCT));
12713 if (maxval_hot)
12714 AddPct(TakenTotalMod, maxval_hot);
12715 }
12716
12717 // Check for table values
12718 SpellBonusEntry const* bonus = sSpellMgr->GetSpellBonusData(spellProto->Id);
12719 float coeff = 0;
12720 float factorMod = 1.0f;
12721 if (bonus)
12722 coeff = (damagetype == DOT) ? bonus->dot_damage : bonus->direct_damage;
12723 else
12724 {
12725 // No bonus healing for SPELL_DAMAGE_CLASS_NONE class spells by default
12726 if (spellProto->DmgClass == SPELL_DAMAGE_CLASS_NONE)
12727 {
12728 healamount = uint32(std::max((float(healamount) * TakenTotalMod), 0.0f));
12729 return healamount;
12730 }
12731 }
12732
12733 // Default calculation
12734 if (TakenAdvertisedBenefit)
12735 {
12736 float TakenCoeff = 0.0f;
12737 if (coeff <= 0)
12738 coeff = CalculateDefaultCoefficient(spellProto, damagetype) * int32(stack) * 1.88f; // As wowwiki says: C = (Cast Time / 3.5) * 1.88 (for healing spells)
12739
12740 factorMod *= CalculateLevelPenalty(spellProto) * int32(stack);
12741 if (Player* modOwner = GetSpellModOwner())
12742 {
12743 coeff *= 100.0f;
12744 modOwner->ApplySpellMod(spellProto->Id, SPELLMOD_BONUS_MULTIPLIER, coeff);
12745 coeff /= 100.0f;
12746 }
12747
12748 TakenTotal += int32(TakenAdvertisedBenefit * (coeff > 0 ? coeff : TakenCoeff) * factorMod);
12749 }
12750
12751 if (caster)
12752 {
12754 for (AuraEffectList::const_iterator i = mHealingGet.begin(); i != mHealingGet.end(); ++i)
12755 if (caster->GetGUID() == (*i)->GetCasterGUID() && (*i)->IsAffectedOnSpell(spellProto))
12756 AddPct(TakenTotalMod, (*i)->GetAmount());
12757 }
12758
12759 for (uint8 i = 0; i < MAX_SPELL_EFFECTS; ++i)
12760 {
12761 switch (spellProto->Effects[i].ApplyAuraName)
12762 {
12763 // Bonus healing does not apply to these spells
12766 TakenTotal = 0;
12767 break;
12768 }
12769 if (spellProto->Effects[i].Effect == SPELL_EFFECT_HEALTH_LEECH)
12770 TakenTotal = 0;
12771 }
12772
12773 // No positive taken bonus, custom attr
12774 if ((spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS) || spellProto->HasAttribute(SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS)) && TakenTotalMod > 1.0f)
12775 {
12776 TakenTotal = 0;
12777 TakenTotalMod = 1.0f;
12778 }
12779
12780 float heal = float(int32(healamount) + TakenTotal) * TakenTotalMod;
12781
12782 return uint32(std::max(heal, 0.0f));
12783}
@ SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS
Definition SharedDefines.h:631
@ SPELL_AURA_MOD_HEALING_RECEIVED
Definition SpellAuraDefines.h:346
@ SPELL_AURA_MOD_HEALING_PCT
Definition SpellAuraDefines.h:181
@ SPELL_AURA_MOD_HOT_PCT
Definition SpellAuraDefines.h:322
int32 GetMaxPositiveAuraModifier(AuraType auratype)
Definition Unit.cpp:6022
int32 GetMaxNegativeAuraModifier(AuraType auratype) const
Definition Unit.cpp:6036
int32 SpellBaseHealingBonusTaken(SpellSchoolMask schoolMask)
Definition Unit.cpp:12818

References AddPct(), CalculateDefaultCoefficient(), CalculateLevelPenalty(), SpellBonusEntry::direct_damage, SpellInfo::DmgClass, DOT, SpellBonusEntry::dot_damage, SpellInfo::Effects, GetAuraEffect(), GetAuraEffectDummy(), GetAuraEffectsByType(), Object::GetGUID(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), SpellInfo::GetSchoolMask(), GetSpellModOwner(), SpellInfo::HasAttribute(), flag96::HasFlag(), SpellInfo::Id, MAX_SPELL_EFFECTS, SPELL_ATTR0_CU_NO_POSITIVE_TAKEN_BONUS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_MOD_HEALING_PCT, SPELL_AURA_MOD_HEALING_RECEIVED, SPELL_AURA_MOD_HOT_PCT, SPELL_AURA_PERIODIC_HEAL, SPELL_AURA_PERIODIC_HEALTH_FUNNEL, SPELL_AURA_PERIODIC_LEECH, SPELL_DAMAGE_CLASS_NONE, SPELL_EFFECT_HEALTH_LEECH, SpellBaseHealingBonusTaken(), SPELLFAMILY_DRUID, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SPELLMOD_BONUS_MULTIPLIER, sScriptMgr, and sSpellMgr.

Referenced by spell_dru_lifebloom::AfterRemove(), Spell::DoAllEffectOnTarget(), Spell::EffectHeal(), Spell::EffectHealMechanical(), Spell::EffectHealPct(), spell_pri_renew::HandleApplyEffect(), Aura::HandleAuraSpecificMods(), AuraEffect::HandlePeriodicHealAurasTick(), and AuraEffect::HandlePeriodicHealthLeechAuraTick().

◆ SpellHitResult() [1/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
Spell const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3564{
3565 SpellInfo const* spellInfo = spell->GetSpellInfo();
3566
3567 // Check for immune
3568 if (victim->IsImmunedToSpell(spellInfo, spell))
3569 {
3570 return SPELL_MISS_IMMUNE;
3571 }
3572
3573 // All positive spells can`t miss
3575 if ((spellInfo->IsPositive() || spellInfo->HasEffect(SPELL_EFFECT_DISPEL))
3576 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3577 {
3578 return SPELL_MISS_NONE;
3579 }
3580
3581 // Check for immune
3582 // xinef: check for school immunity only
3583 if (victim->IsImmunedToSchool(spell))
3584 {
3585 return SPELL_MISS_IMMUNE;
3586 }
3587
3588 if (this == victim)
3589 {
3590 return SPELL_MISS_NONE;
3591 }
3592
3593 // Return evade for units in evade mode
3594 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spellInfo->HasAura(SPELL_AURA_CONTROL_VEHICLE) &&
3596 {
3597 return SPELL_MISS_EVADE;
3598 }
3599
3600 // Try victim reflect spell
3601 if (CanReflect)
3602 {
3603 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3604 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3605 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3606 {
3607 if ((*i)->GetMiscValue() & spell->GetSpellSchoolMask())
3608 {
3609 reflectchance += (*i)->GetAmount();
3610 }
3611 }
3612
3613 if (reflectchance > 0 && roll_chance_i(reflectchance))
3614 {
3615 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3616 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3617 return SPELL_MISS_REFLECT;
3618 }
3619 }
3620
3621 switch (spellInfo->DmgClass)
3622 {
3625 return MeleeSpellHitResult(victim, spellInfo);
3627 {
3628 if (spellInfo->SpellFamilyName)
3629 {
3630 return SPELL_MISS_NONE;
3631 }
3632
3633 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3634 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3635 {
3636 if (spellInfo->Effects[i].Effect && spellInfo->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3637 {
3638 if (spellInfo->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3639 {
3640 return SPELL_MISS_NONE;
3641 }
3642 }
3643 }
3644 [[fallthrough]];
3645 }
3647 return MagicSpellHitResult(victim, spellInfo);
3648 }
3649
3650 return SPELL_MISS_NONE;
3651}
@ SPELL_EFFECT_DISPEL
Definition SharedDefines.h:816
@ SPELL_MISS_IMMUNE
Definition SharedDefines.h:1526
@ SPELL_MISS_EVADE
Definition SharedDefines.h:1525
@ SPELL_MISS_REFLECT
Definition SharedDefines.h:1530
SpellMissInfo MagicSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3355
SpellMissInfo MeleeSpellHitResult(Unit *victim, SpellInfo const *spell)
Definition Unit.cpp:3182

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), Spell::GetSpellInfo(), Spell::GetSpellSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

◆ SpellHitResult() [2/2]

SpellMissInfo Unit::SpellHitResult ( Unit victim,
SpellInfo const *  spell,
bool  canReflect = false 
)
Todo:
: client not show miss log for this spells - so need find info for this in dbc and use it!
3499{
3500 // Check for immune
3501 if (victim->IsImmunedToSpell(spell))
3502 return SPELL_MISS_IMMUNE;
3503
3504 // All positive spells can`t miss
3506 if ((spell->IsPositive() || spell->HasEffect(SPELL_EFFECT_DISPEL))
3507 && (!IsHostileTo(victim))) // prevent from affecting enemy by "positive" spell
3508 return SPELL_MISS_NONE;
3509
3510 // Check for immune
3511 // xinef: check for school immunity only
3512 if (victim->IsImmunedToSchool(spell))
3513 return SPELL_MISS_IMMUNE;
3514
3515 if (this == victim)
3516 return SPELL_MISS_NONE;
3517
3518 // Return evade for units in evade mode
3519 if (victim->IsCreature() && victim->ToCreature()->IsEvadingAttacks() && !spell->HasAura(SPELL_AURA_CONTROL_VEHICLE)
3520 && !spell->HasAttribute(SPELL_ATTR0_CU_IGNORE_EVADE) && !spell->HasAttribute(SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT))
3521 return SPELL_MISS_EVADE;
3522
3523 // Try victim reflect spell
3524 if (CanReflect)
3525 {
3526 int32 reflectchance = victim->GetTotalAuraModifier(SPELL_AURA_REFLECT_SPELLS);
3527 Unit::AuraEffectList const& mReflectSpellsSchool = victim->GetAuraEffectsByType(SPELL_AURA_REFLECT_SPELLS_SCHOOL);
3528 for (Unit::AuraEffectList::const_iterator i = mReflectSpellsSchool.begin(); i != mReflectSpellsSchool.end(); ++i)
3529 if ((*i)->GetMiscValue() & spell->GetSchoolMask())
3530 reflectchance += (*i)->GetAmount();
3531 if (reflectchance > 0 && roll_chance_i(reflectchance))
3532 {
3533 // Start triggers for remove charges if need (trigger only for victim, and mark as active spell)
3534 //ProcDamageAndSpell(victim, PROC_FLAG_NONE, PROC_FLAG_TAKEN_SPELL_MAGIC_DMG_CLASS_NEG, PROC_EX_REFLECT, 1, BASE_ATTACK, spell);
3535 return SPELL_MISS_REFLECT;
3536 }
3537 }
3538
3539 switch (spell->DmgClass)
3540 {
3543 return MeleeSpellHitResult(victim, spell);
3545 {
3546 if (spell->SpellFamilyName)
3547 {
3548 return SPELL_MISS_NONE;
3549 }
3550 // Xinef: apply DAMAGE_CLASS_MAGIC conditions to damaging DAMAGE_CLASS_NONE spells
3551 for (uint8 i = EFFECT_0; i < MAX_SPELL_EFFECTS; ++i)
3552 if (spell->Effects[i].Effect && spell->Effects[i].Effect != SPELL_EFFECT_SCHOOL_DAMAGE)
3553 if (spell->Effects[i].ApplyAuraName != SPELL_AURA_PERIODIC_DAMAGE)
3554 return SPELL_MISS_NONE;
3555 [[fallthrough]];
3556 }
3558 return MagicSpellHitResult(victim, spell);
3559 }
3560 return SPELL_MISS_NONE;
3561}

References SpellInfo::DmgClass, EFFECT_0, SpellInfo::Effects, GetAuraEffectsByType(), SpellInfo::GetSchoolMask(), GetTotalAuraModifier(), SpellInfo::HasAttribute(), SpellInfo::HasAura(), SpellInfo::HasEffect(), Object::IsCreature(), Creature::IsEvadingAttacks(), IsHostileTo(), IsImmunedToSchool(), IsImmunedToSpell(), SpellInfo::IsPositive(), MagicSpellHitResult(), MAX_SPELL_EFFECTS, MeleeSpellHitResult(), roll_chance_i(), SPELL_ATTR0_CU_IGNORE_EVADE, SPELL_ATTR1_AURA_STAYS_AFTER_COMBAT, SPELL_AURA_CONTROL_VEHICLE, SPELL_AURA_PERIODIC_DAMAGE, SPELL_AURA_REFLECT_SPELLS, SPELL_AURA_REFLECT_SPELLS_SCHOOL, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELL_EFFECT_DISPEL, SPELL_EFFECT_SCHOOL_DAMAGE, SPELL_MISS_EVADE, SPELL_MISS_IMMUNE, SPELL_MISS_NONE, SPELL_MISS_REFLECT, SpellInfo::SpellFamilyName, and Object::ToCreature().

Referenced by Spell::AddUnitTarget(), DealMeleeDamage(), AuraEffect::HandlePeriodicDamageAurasTick(), AuraEffect::HandlePeriodicHealthLeechAuraTick(), and AuraEffect::HandlePeriodicManaLeechAuraTick().

◆ SpellPctDamageModsDone()

float Unit::SpellPctDamageModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
11368{
11369 if (!spellProto || !victim || damagetype == DIRECT_DAMAGE)
11370 return 1.0f;
11371
11372 // Some spells don't benefit from done mods
11373 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
11374 return 1.0f;
11375
11376 // For totems get damage bonus from owner
11377 if (IsCreature())
11378 {
11379 if (IsTotem())
11380 {
11381 if (Unit* owner = GetOwner())
11382 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11383 }
11384 // Dancing Rune Weapon...
11385 else if (GetEntry() == 27893)
11386 {
11387 if (Unit* owner = GetOwner())
11388 return owner->SpellPctDamageModsDone(victim, spellProto, damagetype);
11389 }
11390 }
11391
11392 // Done total percent damage auras
11393 float DoneTotalMod = 1.0f;
11394
11396 for (AuraEffectList::const_iterator i = mModDamagePercentDone.begin(); i != mModDamagePercentDone.end(); ++i)
11397 {
11398 // prevent apply mods from weapon specific case to non weapon specific spells (Example: thunder clap and two-handed weapon specialization)
11399 if (spellProto->EquippedItemClass == -1 && (*i)->GetSpellInfo()->EquippedItemClass != -1 &&
11400 !(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && (*i)->GetMiscValue() == SPELL_SCHOOL_MASK_NORMAL)
11401 {
11402 continue;
11403 }
11404
11405 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11406 continue;
11407
11408 if (!sScriptMgr->IsNeedModSpellDamagePercent(this, *i, DoneTotalMod, spellProto))
11409 continue;
11410
11411 if ((*i)->GetMiscValue() & spellProto->GetSchoolMask())
11412 {
11413 if ((*i)->GetSpellInfo()->EquippedItemClass == -1)
11414 AddPct(DoneTotalMod, (*i)->GetAmount());
11415 else if (!(*i)->GetSpellInfo()->HasAttribute(SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM) && ((*i)->GetSpellInfo()->EquippedItemSubClassMask == 0))
11416 AddPct(DoneTotalMod, (*i)->GetAmount());
11417 else if (ToPlayer() && ToPlayer()->HasItemFitToSpellRequirements((*i)->GetSpellInfo()))
11418 AddPct(DoneTotalMod, (*i)->GetAmount());
11419 }
11420 }
11421
11422 uint32 creatureTypeMask = victim->GetCreatureTypeMask();
11424 for (AuraEffectList::const_iterator i = mDamageDoneVersus.begin(); i != mDamageDoneVersus.end(); ++i)
11425 if ((creatureTypeMask & uint32((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11426 AddPct(DoneTotalMod, (*i)->GetAmount());
11427
11428 // bonus against aurastate
11430 for (AuraEffectList::const_iterator i = mDamageDoneVersusAurastate.begin(); i != mDamageDoneVersusAurastate.end(); ++i)
11431 if (victim->HasAuraState(AuraStateType((*i)->GetMiscValue())) && spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11432 AddPct(DoneTotalMod, (*i)->GetAmount());
11433
11434 // done scripted mod (take it from owner)
11435 Unit* owner = GetOwner() ? GetOwner() : this;
11436 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
11437 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
11438 {
11439 // Xinef: self cast is ommited (because of Rage of Rivendare)
11440 if (!spellProto->ValidateAttribute6SpellDamageMods(this, *i, damagetype == DOT))
11441 continue;
11442
11443 // xinef: Molten Fury should work on all spells
11444 switch ((*i)->GetMiscValue())
11445 {
11446 case 4920: // Molten Fury
11447 case 4919:
11448 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11449 AddPct(DoneTotalMod, (*i)->GetAmount());
11450 break;
11451 }
11452
11453 if (!(*i)->IsAffectedOnSpell(spellProto))
11454 continue;
11455
11456 switch ((*i)->GetMiscValue())
11457 {
11458 case 6917: // Death's Embrace
11459 case 6926:
11460 case 6928:
11461 {
11462 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11463 AddPct(DoneTotalMod, (*i)->GetAmount());
11464 break;
11465 }
11466 // Soul Siphon
11467 case 4992:
11468 case 4993:
11469 {
11470 // effect 1 m_amount
11471 int32 maxPercent = (*i)->GetAmount();
11472 // effect 0 m_amount
11473 int32 stepPercent = CalculateSpellDamage(this, (*i)->GetSpellInfo(), 0);
11474 // count affliction effects and calc additional damage in percentage
11475 int32 modPercent = 0;
11476 AuraApplicationMap const& victimAuras = victim->GetAppliedAuras();
11477 for (AuraApplicationMap::const_iterator itr = victimAuras.begin(); itr != victimAuras.end(); ++itr)
11478 {
11479 Aura const* aura = itr->second->GetBase();
11480 SpellInfo const* m_spell = aura->GetSpellInfo();
11481 if (m_spell->SpellFamilyName != SPELLFAMILY_WARLOCK || !(m_spell->SpellFamilyFlags[1] & 0x0004071B || m_spell->SpellFamilyFlags[0] & 0x8044C402))
11482 continue;
11483 modPercent += stepPercent * aura->GetStackAmount();
11484 if (modPercent >= maxPercent)
11485 {
11486 modPercent = maxPercent;
11487 break;
11488 }
11489 }
11490 AddPct(DoneTotalMod, modPercent);
11491 break;
11492 }
11493 case 6916: // Death's Embrace
11494 case 6925:
11495 case 6927:
11496 if (HasAuraState(AURA_STATE_HEALTHLESS_20_PERCENT, spellProto, this))
11497 AddPct(DoneTotalMod, (*i)->GetAmount());
11498 break;
11499 case 5481: // Starfire Bonus
11500 {
11501 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_DRUID, 0x200002, 0, 0))
11502 AddPct(DoneTotalMod, (*i)->GetAmount());
11503 break;
11504 }
11505 // Tundra Stalker
11506 // Merciless Combat
11507 case 7277:
11508 {
11509 // Merciless Combat
11510 if ((*i)->GetSpellInfo()->SpellIconID == 2656)
11511 {
11512 if ((spellProto && spellProto->SpellFamilyFlags[0] & 0x2) || spellProto->SpellFamilyFlags[1] & 0x2 )
11513 if (!victim->HealthAbovePct(35))
11514 AddPct(DoneTotalMod, (*i)->GetAmount());
11515 }
11516 // Tundra Stalker
11517 else
11518 {
11519 // Frost Fever (target debuff)
11520 if (victim->HasAura(55095))
11521 AddPct(DoneTotalMod, (*i)->GetAmount());
11522 break;
11523 }
11524 break;
11525 }
11526 // Rage of Rivendare
11527 case 7293:
11528 {
11530 AddPct(DoneTotalMod, (*i)->GetSpellInfo()->GetRank() * 2.0f);
11531 break;
11532 }
11533 // Twisted Faith
11534 case 7377:
11535 {
11537 AddPct(DoneTotalMod, (*i)->GetAmount());
11538 break;
11539 }
11540 // Marked for Death
11541 case 7598:
11542 case 7599:
11543 case 7600:
11544 case 7601:
11545 case 7602:
11546 {
11547 if (victim->GetAuraEffect(SPELL_AURA_MOD_STALKED, SPELLFAMILY_HUNTER, 0x400, 0, 0))
11548 AddPct(DoneTotalMod, (*i)->GetAmount());
11549 break;
11550 }
11551 // Dirty Deeds
11552 case 6427:
11553 case 6428:
11554 case 6579:
11555 case 6580:
11556 {
11557 if (victim->HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, this))
11558 {
11559 // effect 0 has expected value but in negative state
11560 int32 bonus = -(*i)->GetBase()->GetEffect(0)->GetAmount();
11561 AddPct(DoneTotalMod, bonus);
11562 }
11563 break;
11564 }
11565 }
11566 }
11567
11568 // Custom scripted damage
11569 switch (spellProto->SpellFamilyName)
11570 {
11571 case SPELLFAMILY_MAGE:
11572 // Ice Lance
11573 if (spellProto->SpellIconID == 186)
11574 {
11575 if (victim->HasAuraState(AURA_STATE_FROZEN, spellProto, this))
11576 {
11577 // Glyph of Ice Lance
11578 if (owner->HasAura(56377) && victim->GetLevel() > owner->GetLevel())
11579 DoneTotalMod *= 4.0f;
11580 else
11581 DoneTotalMod *= 3.0f;
11582 }
11583 }
11584
11585 // Torment the weak
11586 if (spellProto->SpellFamilyFlags[0] & 0x20600021 || spellProto->SpellFamilyFlags[1] & 0x9000)
11587 if (victim->HasAuraWithMechanic((1 << MECHANIC_SNARE) | (1 << MECHANIC_SLOW_ATTACK)))
11589 AddPct(DoneTotalMod, aurEff->GetAmount());
11590 break;
11591 case SPELLFAMILY_PRIEST:
11592 // Mind Flay
11593 if (spellProto->SpellFamilyFlags[0] & 0x800000)
11594 {
11595 // Glyph of Shadow Word: Pain
11596 if (AuraEffect* aurEff = GetAuraEffect(55687, 0))
11597 // Increase Mind Flay damage if Shadow Word: Pain present on target
11599 AddPct(DoneTotalMod, aurEff->GetAmount());
11600
11601 // Twisted Faith - Mind Flay part
11603 // Increase Mind Flay damage if Shadow Word: Pain present on target
11605 AddPct(DoneTotalMod, aurEff->GetAmount());
11606 }
11607 // Smite
11608 else if (spellProto->SpellFamilyFlags[0] & 0x80)
11609 {
11610 // Glyph of Smite
11611 if (AuraEffect* aurEff = GetAuraEffect(55692, 0))
11612 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_PRIEST, 0x100000, 0, 0, GetGUID()))
11613 AddPct(DoneTotalMod, aurEff->GetAmount());
11614 }
11615 // Shadow Word: Death
11616 else if (spellProto->SpellFamilyFlags[1] & 0x2)
11617 {
11618 // Glyph of Shadow Word: Death
11619 if (AuraEffect* aurEff = GetAuraEffect(55682, 1))
11621 AddPct(DoneTotalMod, aurEff->GetAmount());
11622 }
11623
11624 break;
11626 // Judgement of Vengeance/Judgement of Corruption
11627 if ((spellProto->SpellFamilyFlags[1] & 0x400000) && spellProto->SpellIconID == 2292)
11628 {
11629 // Get stack of Holy Vengeance/Blood Corruption on the target added by caster
11630 uint32 stacks = 0;
11632 for (Unit::AuraEffectList::const_iterator itr = auras.begin(); itr != auras.end(); ++itr)
11633 if (((*itr)->GetId() == 31803 || (*itr)->GetId() == 53742) && (*itr)->GetCasterGUID() == GetGUID())
11634 {
11635 stacks = (*itr)->GetBase()->GetStackAmount();
11636 break;
11637 }
11638 // + 10% for each application of Holy Vengeance/Blood Corruption on the target
11639 if (stacks)
11640 AddPct(DoneTotalMod, 10 * stacks);
11641 }
11642 break;
11643 case SPELLFAMILY_DRUID:
11644 // Thorns
11645 if (spellProto->SpellFamilyFlags[0] & 0x100)
11646 {
11647 // Brambles
11648 if (AuraEffect* aurEff = GetAuraEffectOfRankedSpell(16836, 0))
11649 AddPct(DoneTotalMod, aurEff->GetAmount());
11650 }
11651 break;
11653 // Fire and Brimstone
11654 if (spellProto->SpellFamilyFlags[1] & 0x00020040)
11656 {
11658 for (AuraEffectList::const_iterator i = mDumyAuras.begin(); i != mDumyAuras.end(); ++i)
11659 if ((*i)->GetSpellInfo()->SpellIconID == 3173)
11660 {
11661 AddPct(DoneTotalMod, (*i)->GetAmount());
11662 break;
11663 }
11664 }
11665 // Drain Soul - increased damage for targets under 25 % HP
11666 if (spellProto->SpellFamilyFlags[0] & 0x00004000)
11667 if (!victim->HealthAbovePct(25))
11668 DoneTotalMod *= 4;
11669 // Shadow Bite (15% increase from each dot)
11670 if (spellProto->SpellFamilyFlags[1] & 0x00400000 && IsPet())
11671 if (uint8 count = victim->GetDoTsByCaster(GetOwnerGUID()))
11672 AddPct(DoneTotalMod, 15 * count);
11673 break;
11674 case SPELLFAMILY_HUNTER:
11675 // Steady Shot
11676 if (spellProto->SpellFamilyFlags[1] & 0x1)
11677 if (AuraEffect* aurEff = GetAuraEffect(56826, 0)) // Glyph of Steady Shot
11678 if (victim->GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_HUNTER, 0x00004000, 0, 0, GetGUID()))
11679 AddPct(DoneTotalMod, aurEff->GetAmount());
11680 break;
11682 // Improved Icy Touch
11683 if (spellProto->SpellFamilyFlags[0] & 0x2)
11685 AddPct(DoneTotalMod, aurEff->GetAmount());
11686
11687 // Glacier Rot
11688 if (spellProto->SpellFamilyFlags[0] & 0x2 || spellProto->SpellFamilyFlags[1] & 0x6)
11690 if (victim->GetDiseasesByCaster(owner->GetGUID()) > 0)
11691 AddPct(DoneTotalMod, aurEff->GetAmount());
11692 break;
11693 }
11694
11695 return DoneTotalMod;
11696}
@ MECHANIC_SLOW_ATTACK
Definition SharedDefines.h:1333
@ AURA_STATE_HEALTHLESS_20_PERCENT
Definition SharedDefines.h:1293
@ AURA_STATE_CONFLAGRATE
Definition SharedDefines.h:1306
uint32 GetDiseasesByCaster(ObjectGuid casterGUID, uint8 mode=0)
Definition Unit.cpp:5900
bool HasAuraWithMechanic(uint32 mechanicMask) const
Definition Unit.cpp:5871
uint32 GetDoTsByCaster(ObjectGuid casterGUID) const
Definition Unit.cpp:5954

References AddPct(), AURA_STATE_CONFLAGRATE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, CalculateSpellDamage(), DIRECT_DAMAGE, DOT, EFFECT_0, SpellInfo::EquippedItemClass, GetAppliedAuras(), GetAuraEffect(), GetAuraEffectOfRankedSpell(), GetAuraEffectsByType(), GetCreatureTypeMask(), GetDiseasesByCaster(), GetDoTsByCaster(), GetDummyAuraEffect(), Object::GetEntry(), Object::GetGUID(), Object::GetGUID(), GetLevel(), GetOwner(), GetOwnerGUID(), SpellInfo::GetSchoolMask(), Aura::GetSpellInfo(), Aura::GetStackAmount(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), HealthAbovePct(), Object::IsCreature(), IsPet(), IsTotem(), MECHANIC_SLOW_ATTACK, MECHANIC_SNARE, SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR5_AURA_AFFECTS_NOT_JUST_REQ_EQUIPPED_ITEM, SPELL_AURA_DUMMY, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS, SPELL_AURA_MOD_DAMAGE_DONE_VERSUS_AURASTATE, SPELL_AURA_MOD_DAMAGE_PERCENT_DONE, SPELL_AURA_MOD_STALKED, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_SCHOOL_MASK_NORMAL, SPELLFAMILY_DEATHKNIGHT, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_HUNTER, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_PRIEST, SPELLFAMILY_WARLOCK, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, sScriptMgr, Object::ToPlayer(), and SpellInfo::ValidateAttribute6SpellDamageMods().

Referenced by AuraEffect::CalculatePeriodicData(), and SpellDamageBonusDone().

◆ SpellPctHealingModsDone()

float Unit::SpellPctHealingModsDone ( Unit victim,
SpellInfo const *  spellProto,
DamageEffectType  damagetype 
)
12444{
12445 // For totems get healing bonus from owner (statue isn't totem in fact)
12446 if (IsCreature() && IsTotem())
12447 if (Unit* owner = GetOwner())
12448 return owner->SpellPctHealingModsDone(victim, spellProto, damagetype);
12449
12450 // Some spells don't benefit from done mods
12451 if (spellProto->HasAttribute(SPELL_ATTR3_IGNORE_CASTER_MODIFIERS))
12452 return 1.0f;
12453
12454 // xinef: Some spells don't benefit from done mods
12455 if (spellProto->HasAttribute(SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS))
12456 return 1.0f;
12457
12458 // No bonus healing for potion spells
12459 if (spellProto->SpellFamilyName == SPELLFAMILY_POTION)
12460 return 1.0f;
12461
12462 float DoneTotalMod = 1.0f;
12463
12464 // Healing done percent
12466 for (auto const& auraEff : mHealingDonePct)
12467 {
12468 if (!sScriptMgr->IsNeedModHealPercent(this, auraEff, DoneTotalMod, spellProto))
12469 continue;
12470
12471 AddPct(DoneTotalMod, auraEff->GetAmount());
12472 }
12473
12474 // done scripted mod (take it from owner)
12475 Unit* owner = GetOwner() ? GetOwner() : this;
12476 AuraEffectList const& mOverrideClassScript = owner->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12477 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12478 {
12479 if (!(*i)->IsAffectedOnSpell(spellProto))
12480 continue;
12481
12482 switch ((*i)->GetMiscValue())
12483 {
12484 case 21: // Test of Faith
12485 case 6935:
12486 case 6918:
12487 if (victim->HealthBelowPct(50))
12488 AddPct(DoneTotalMod, (*i)->GetAmount());
12489 break;
12490 case 7798: // Glyph of Regrowth
12491 {
12493 AddPct(DoneTotalMod, (*i)->GetAmount());
12494 break;
12495 }
12496
12497 case 7871: // Glyph of Lesser Healing Wave
12498 {
12499 // xinef: affected by any earth shield
12500 if (victim->GetAuraEffect(SPELL_AURA_DUMMY, SPELLFAMILY_SHAMAN, 0, 0x00000400, 0))
12501 AddPct(DoneTotalMod, (*i)->GetAmount());
12502 break;
12503 }
12504 default:
12505 break;
12506 }
12507 }
12508
12509 switch (spellProto->SpellFamilyName)
12510 {
12512 // Talents and glyphs for healing stream totem
12513 if (spellProto->Id == 52042)
12514 {
12515 // Glyph of Healing Stream Totem
12516 if (AuraEffect* dummy = owner->GetAuraEffect(55456, EFFECT_0))
12517 AddPct(DoneTotalMod, dummy->GetAmount());
12518
12519 // Healing Stream totem - Restorative Totems
12520 if (AuraEffect* aurEff = GetDummyAuraEffect(SPELLFAMILY_SHAMAN, 338, 1))
12521 AddPct(DoneTotalMod, aurEff->GetAmount());
12522 }
12523 break;
12524 case SPELLFAMILY_PRIEST:
12525 // T9 HEALING 4P, empowered renew instant heal
12526 if (spellProto->Id == 63544)
12527 if (AuraEffect* aurEff = GetAuraEffect(67202, EFFECT_0))
12528 AddPct(DoneTotalMod, aurEff->GetAmount());
12529 break;
12530 }
12531
12532 return DoneTotalMod;
12533}
@ SPELL_AURA_MOD_HEALING_DONE_PERCENT
Definition SpellAuraDefines.h:199

References AddPct(), EFFECT_0, GetAuraEffect(), GetAuraEffectsByType(), GetDummyAuraEffect(), GetOwner(), SpellInfo::HasAttribute(), HealthBelowPct(), SpellInfo::Id, Object::IsCreature(), IsTotem(), SPELL_ATTR3_IGNORE_CASTER_MODIFIERS, SPELL_ATTR6_IGNORE_HEALTH_MODIFIERS, SPELL_AURA_DUMMY, SPELL_AURA_MOD_HEALING_DONE_PERCENT, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_HEAL, SPELLFAMILY_DRUID, SPELLFAMILY_GENERIC, SPELLFAMILY_POTION, SPELLFAMILY_PRIEST, SPELLFAMILY_SHAMAN, SpellInfo::SpellFamilyName, and sScriptMgr.

Referenced by AuraEffect::CalculatePeriodicData(), and SpellHealingBonusDone().

◆ SpellTakenCritChance()

float Unit::SpellTakenCritChance ( Unit const *  caster,
SpellInfo const *  spellProto,
SpellSchoolMask  schoolMask,
float  doneChance,
WeaponAttackType  attackType,
bool  skipEffectCheck 
) const
Todo:
: Not sure whether the fallthrough was a mistake (forgetting a break) or intended. This should be double-checked.
12153{
12154 // not critting spell
12155 if (spellProto->HasAttribute(SPELL_ATTR2_CANT_CRIT))
12156 return 0.0f;
12157
12158 // Xinef: check if spell is capable of critting, auras requires special aura to crit so they can be skipped
12159 if (!skipEffectCheck && !spellProto->IsCritCapable())
12160 return 0.0f;
12161
12162 float crit_chance = doneChance;
12163 switch (spellProto->DmgClass)
12164 {
12166 {
12167 if (!spellProto->IsPositive())
12168 {
12169 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE
12170 // xinef: apply max and min only
12172 {
12175 }
12176
12177 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_SPELL);
12178 }
12179 // scripted (increase crit chance ... against ... target by x%
12180 if (caster)
12181 {
12182 AuraEffectList const& mOverrideClassScript = caster->GetAuraEffectsByType(SPELL_AURA_OVERRIDE_CLASS_SCRIPTS);
12183 for (AuraEffectList::const_iterator i = mOverrideClassScript.begin(); i != mOverrideClassScript.end(); ++i)
12184 {
12185 if (!((*i)->IsAffectedOnSpell(spellProto)))
12186 continue;
12187 int32 modChance = 0;
12188 switch ((*i)->GetMiscValue())
12189 {
12190 // Shatter
12191 case 911:
12192 modChance += 16;
12193 [[fallthrough]];
12194 case 910:
12195 modChance += 17;
12196 [[fallthrough]];
12197 case 849:
12198 modChance += 17;
12199 if (!HasAuraState(AURA_STATE_FROZEN, spellProto, caster))
12200 break;
12201 crit_chance += modChance;
12202 break;
12203 case 7917: // Glyph of Shadowburn
12204 if (HasAuraState(AURA_STATE_HEALTHLESS_35_PERCENT, spellProto, caster))
12205 crit_chance += (*i)->GetAmount();
12206 break;
12207 case 7997: // Renewed Hope
12208 case 7998:
12209 if (HasAura(6788))
12210 crit_chance += (*i)->GetAmount();
12211 break;
12212 default:
12213 break;
12214 }
12215 }
12216 // Custom crit by class
12217 switch (spellProto->SpellFamilyName)
12218 {
12219 case SPELLFAMILY_MAGE:
12220 // Glyph of Fire Blast
12221 if (spellProto->SpellFamilyFlags[0] == 0x2 && spellProto->SpellIconID == 12)
12223 if (AuraEffect const* aurEff = caster->GetAuraEffect(56369, EFFECT_0))
12224 crit_chance += aurEff->GetAmount();
12225 break;
12226 case SPELLFAMILY_DRUID:
12227 // Improved Faerie Fire
12229 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 109, 0))
12230 crit_chance += aurEff->GetAmount();
12231
12232 // cumulative effect - don't break
12233
12234 // Starfire
12235 if (spellProto->SpellFamilyFlags[0] & 0x4 && spellProto->SpellIconID == 1485)
12236 {
12237 // Improved Insect Swarm
12238 if (AuraEffect const* aurEff = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 1771, 0))
12240 crit_chance += aurEff->GetAmount();
12241 break;
12242 }
12243 break;
12244 case SPELLFAMILY_ROGUE:
12245 // Shiv-applied poisons can't crit
12246 if (caster->FindCurrentSpellBySpellId(5938))
12247 crit_chance = 0.0f;
12248 break;
12250 // Flash of light
12251 if (spellProto->SpellFamilyFlags[0] & 0x40000000)
12252 {
12253 // Sacred Shield
12254 if (AuraEffect const* aura = GetAuraEffect(58597, 1, GetGUID()))
12255 crit_chance += aura->GetAmount();
12256 break;
12257 }
12258 // Exorcism
12259 else if (spellProto->GetCategory() == 19)
12260 {
12262 return 100.0f;
12263 break;
12264 }
12265 break;
12266 case SPELLFAMILY_SHAMAN:
12267 // Lava Burst
12268 if (spellProto->SpellFamilyFlags[1] & 0x00001000)
12269 {
12270 if (GetAuraEffect(SPELL_AURA_PERIODIC_DAMAGE, SPELLFAMILY_SHAMAN, 0x10000000, 0, 0, caster->GetGUID()))
12272 return 100.0f;
12273 break;
12274 }
12275 break;
12276 }
12277 }
12278 break;
12279 }
12281 // Custom crit by class
12282 if (caster)
12283 {
12284 switch (spellProto->SpellFamilyName)
12285 {
12286 case SPELLFAMILY_DRUID:
12287 // Rend and Tear - bonus crit chance for Ferocious Bite on bleeding targets
12288 if (spellProto->SpellFamilyFlags[0] & 0x00800000 && spellProto->SpellIconID == 1680 && HasAuraState(AURA_STATE_BLEEDING))
12289 {
12290 if (AuraEffect const* rendAndTear = caster->GetDummyAuraEffect(SPELLFAMILY_DRUID, 2859, 1))
12291 crit_chance += rendAndTear->GetAmount();
12292 break;
12293 }
12294 break;
12296 // Victory Rush
12297 if (spellProto->SpellFamilyFlags[1] & 0x100)
12298 {
12299 // Glyph of Victory Rush
12300 if (AuraEffect const* aurEff = caster->GetAuraEffect(58382, 0))
12301 crit_chance += aurEff->GetAmount();
12302 break;
12303 }
12304 break;
12305 }
12306 }
12307
12308 // 100% critical chance against sitting target
12310 {
12311 return 100.0f;
12312 }
12313 [[fallthrough]];
12315 {
12316 // flat aura mods
12317 if (attackType == RANGED_ATTACK)
12319 else
12321
12322 // reduce crit chance from Rating for players
12323 if (attackType != RANGED_ATTACK)
12324 {
12325 // xinef: little hack, crit chance dont require caster to calculate, pass victim
12326 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_MELEE);
12327 }
12328 else
12329 Unit::ApplyResilience(this, &crit_chance, nullptr, false, CR_CRIT_TAKEN_RANGED);
12330
12331 // Apply crit chance from defence skill
12332 if (caster)
12333 crit_chance += (int32(caster->GetMaxSkillValueForLevel(this)) - int32(GetDefenseSkillValue(caster))) * 0.04f;
12334
12335 break;
12336 }
12337 // values overridden in spellmgr for lifebloom and earth shield
12339 default:
12340 return 0.0f;
12341 }
12342
12343 if (caster)
12344 {
12346 for (AuraEffectList::const_iterator i = mTotalAuraList.begin(); i != mTotalAuraList.end(); ++i)
12347 {
12348 if (caster->GetGUID() != (*i)->GetCasterGUID())
12349 continue;
12350
12351 crit_chance += (*i)->GetAmount();
12352 }
12353 }
12354
12355 // Modify critical chance by victim SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE
12356 // xinef: should be calculated at the end
12357 if (!spellProto->IsPositive())
12359
12360 // xinef: can be negative!
12361 return crit_chance;
12362}
uint32 const CREATURE_TYPEMASK_DEMON_OR_UNDEAD
Definition SharedDefines.h:2643
@ MECHANIC_KNOCKOUT
Definition SharedDefines.h:1339
@ AURA_STATE_BLEEDING
Definition SharedDefines.h:1310
@ AURA_STATE_FAERIE_FIRE
Definition SharedDefines.h:1304
int32 GetMaxPositiveAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask, const AuraEffect *except=nullptr) const
Definition Unit.cpp:6073
bool HasAttackerSpellCritChanceAura() const
Definition Unit.h:1746
int32 GetMaxNegativeAuraModifierByMiscMask(AuraType auratype, uint32 misc_mask) const
Definition Unit.cpp:6087

References ApplyResilience(), AURA_STATE_BLEEDING, AURA_STATE_FAERIE_FIRE, AURA_STATE_FROZEN, AURA_STATE_HEALTHLESS_35_PERCENT, CR_CRIT_TAKEN_MELEE, CR_CRIT_TAKEN_RANGED, CR_CRIT_TAKEN_SPELL, CREATURE_TYPEMASK_DEMON_OR_UNDEAD, SpellInfo::DmgClass, EFFECT_0, FindCurrentSpellBySpellId(), GetAuraEffect(), GetAuraEffectsByType(), SpellInfo::GetCategory(), GetCreatureTypeMask(), GetDefenseSkillValue(), GetDummyAuraEffect(), Object::GetGUID(), Object::GetGUID(), GetMaxNegativeAuraModifierByMiscMask(), GetMaxPositiveAuraModifierByMiscMask(), GetMaxSkillValueForLevel(), getStandState(), GetTotalAuraModifier(), HasAttackerSpellCritChanceAura(), SpellInfo::HasAttribute(), HasAura(), HasAuraState(), HasAuraWithMechanic(), SpellInfo::IsCritCapable(), Object::IsPlayer(), SpellInfo::IsPositive(), IsSitState(), MECHANIC_KNOCKOUT, MECHANIC_STUN, RANGED_ATTACK, SPELL_ATTR2_CANT_CRIT, SPELL_AURA_MOD_ATTACKER_MELEE_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_RANGED_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_AND_WEAPON_CRIT_CHANCE, SPELL_AURA_MOD_ATTACKER_SPELL_CRIT_CHANCE, SPELL_AURA_MOD_CRIT_CHANCE_FOR_CASTER, SPELL_AURA_OVERRIDE_CLASS_SCRIPTS, SPELL_AURA_PERIODIC_DAMAGE, SPELL_DAMAGE_CLASS_MAGIC, SPELL_DAMAGE_CLASS_MELEE, SPELL_DAMAGE_CLASS_NONE, SPELL_DAMAGE_CLASS_RANGED, SPELLFAMILY_DRUID, SPELLFAMILY_MAGE, SPELLFAMILY_PALADIN, SPELLFAMILY_ROGUE, SPELLFAMILY_SHAMAN, SPELLFAMILY_WARRIOR, SpellInfo::SpellFamilyFlags, SpellInfo::SpellFamilyName, SpellInfo::SpellIconID, and UNIT_STAND_STATE_SLEEP.

Referenced by AuraEffect::CalcPeriodicCritChance(), and Spell::DoAllEffectOnLaunchTarget().

◆ StartReactiveTimer()

void Unit::StartReactiveTimer ( ReactiveType  reactive)
inline
#define REACTIVE_TIMER_START
Definition Unit.h:591

References m_reactiveTimer, and REACTIVE_TIMER_START.

Referenced by ProcDamageAndSpellFor().

◆ StopAttackFaction()

void Unit::StopAttackFaction ( uint32  faction_id)
19989{
19990 if (Unit* victim = GetVictim())
19991 {
19992 if (victim->GetFactionTemplateEntry()->faction == faction_id)
19993 {
19994 AttackStop();
19995 if (IsNonMeleeSpellCast(false))
19997
19998 // melee and ranged forced attack cancel
19999 if (IsPlayer())
20001 }
20002 }
20003
20004 AttackerSet const& attackers = getAttackers();
20005 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20006 {
20007 if ((*itr)->GetFactionTemplateEntry()->faction == faction_id)
20008 {
20009 (*itr)->AttackStop();
20010 itr = attackers.begin();
20011 }
20012 else
20013 ++itr;
20014 }
20015
20017
20018 for (ControlSet::const_iterator itr = m_Controlled.begin(); itr != m_Controlled.end(); ++itr)
20019 (*itr)->StopAttackFaction(faction_id);
20020}
void deleteReferencesForFaction(uint32 faction)
Definition HostileRefMgr.cpp:162

References AttackStop(), HostileRefMgr::deleteReferencesForFaction(), getAttackers(), getHostileRefMgr(), GetVictim(), InterruptNonMeleeSpells(), IsNonMeleeSpellCast(), Object::IsPlayer(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by AuraEffect::HandleForceReaction().

◆ StopAttackingInvalidTarget()

void Unit::StopAttackingInvalidTarget ( )
20023{
20024 AttackerSet const& attackers = getAttackers();
20025 for (AttackerSet::const_iterator itr = attackers.begin(); itr != attackers.end();)
20026 {
20027 Unit* attacker = (*itr);
20028 if (!attacker->IsValidAttackTarget(this))
20029 {
20030 attacker->AttackStop();
20031 if (attacker->IsPlayer())
20032 {
20034 }
20035
20036 for (Unit* controlled : attacker->m_Controlled)
20037 {
20038 if (controlled->GetVictim() == this && !controlled->IsValidAttackTarget(this))
20039 {
20040 controlled->AttackStop();
20041 }
20042 }
20043
20044 itr = attackers.begin();
20045 }
20046 else
20047 {
20048 ++itr;
20049 }
20050 }
20051}

References AttackStop(), getAttackers(), Object::IsPlayer(), IsValidAttackTarget(), m_Controlled, Player::SendAttackSwingCancelAttack(), and Object::ToPlayer().

Referenced by RemoveCharmedBy(), and SetCharmedBy().

◆ StopMoving()

void Unit::StopMoving ( )
16723{
16725
16726 // not need send any packets if not in world or not moving
16727 if (!IsInWorld())
16728 return;
16729
16730 if (movespline->Finalized())
16731 return;
16732
16733 // Update position now since Stop does not start a new movement that can be updated later
16734 if (movespline->HasStarted())
16736
16737 Movement::MoveSplineInit init(this);
16738 init.Stop();
16739}
bool HasStarted() const
Definition MoveSpline.h:129
void UpdateSplinePosition()
Definition Unit.cpp:608

References ClearUnitState(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::HasStarted(), Object::IsInWorld(), movespline, Movement::MoveSplineInit::Stop(), UNIT_STATE_MOVING, and UpdateSplinePosition().

Referenced by npc_escortAI::AttackStart(), SmartAI::AttackStart(), boss_alar::ConstructWaypointsAndMove(), boss_baron_geddon::boss_baron_geddonAI::DamageTaken(), boss_grand_champion::boss_grand_championAI::DamageTaken(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_ingvar_the_plunderer::DamageTaken(), npc_vrykul_skeleton::DamageTaken(), npc_blistering_zombie::npc_blistering_zombieAI::DamageTaken(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::DoAction(), npc_kinetic_bomb::npc_kinetic_bombAI::DoAction(), npc_spinestalker::npc_spinestalkerAI::DoAction(), npc_rimefang::npc_rimefangAI::DoAction(), ScriptedAI::DoCastSpell(), FlightPathMovementGenerator::DoFinalize(), FleeingMovementGenerator< T >::DoFinalize(), ConfusedMovementGenerator< T >::DoFinalize(), npc_taskmaster_fizzule::npc_taskmaster_fizzuleAI::DoFriend(), ChaseMovementGenerator< T >::DoInitialize(), WaypointMovementGenerator< Creature >::DoUpdate(), RandomMovementGenerator< T >::DoUpdate(), ChaseMovementGenerator< T >::DoUpdate(), FollowMovementGenerator< T >::DoUpdate(), boss_blood_queen_lana_thel::boss_blood_queen_lana_thelAI::GoToMinchar(), debug_commandscript::HandleDebugMoveflagsCommand(), WorldSession::HandlePetActionHelper(), RotateMovementGenerator::Initialize(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::IsSummonedBy(), boss_kologarn::boss_kologarnAI::JustDied(), boss_swamplord_muselek::JustEngagedWith(), boss_janalai::JustEngagedWith(), Player::LeaveBattleground(), SmartAI::MoveAway(), boss_headless_horseman::MovementInform(), boss_kaelthas::MovementInform(), boss_jedoga_shadowseeker::MovementInform(), boss_ghazan::MovementInform(), npc_ball_of_flame::npc_ball_of_flameAI::MovementInform(), npc_toc5_player_vehicle::npc_toc5_player_vehicleAI::OnCharmed(), PauseMovement(), SmartAI::PausePath(), npc_hidden_cultist::npc_hidden_cultistAI::PreScript(), RemoveCharmedBy(), Creature::RemoveCorpse(), boss_felblood_kaelthas::Reset(), npc_xt002_scrapbot::npc_xt002_scrapbotAI::Reset(), npc_xt002_boombot::npc_xt002_boombotAI::Reset(), boss_leotheras_the_blind::Reset(), IdleMovementGenerator::Reset(), npc_putricide_oozeAI::SelectNewTarget(), npc_icc_ice_sphere::npc_icc_ice_sphereAI::SelectNewTarget(), SetCharmedBy(), SmartAI::SetCombatMove(), SetConfused(), boss_victor_nefarius::boss_victor_nefariusAI::SetData(), setDeathState(), SetFeared(), FollowerAI::SetFollowComplete(), FollowerAI::SetFollowPaused(), SetRooted(), npc_magister_aledis::sGossipSelect(), npc_harrison_jones::SpellHit(), npc_cult_fanatic::npc_cult_fanaticAI::SpellHit(), npc_cult_adherent::npc_cult_adherentAI::SpellHit(), npc_tirion_fordring_tft::npc_tirion_fordringAI::SpellHit(), boss_urom::boss_uromAI::SpellHit(), npc_vengeful_shade::npc_vengeful_shadeAI::SpellHitTarget(), boss_heigan::boss_heiganAI::StartFightPhase(), SmartAI::StopFollow(), SmartAI::StopPath(), CreatureAI::TriggerAlert(), Pet::Update(), TimedFleeingMovementGenerator::Update(), boss_onyxia::UpdateAI(), boss_grand_champion::boss_grand_championAI::UpdateAI(), boss_jormungarAI::UpdateAI(), boss_icehowl::boss_icehowlAI::UpdateAI(), npc_hor_lich_king::npc_hor_lich_kingAI::UpdateAI(), npc_kinetic_bomb::npc_kinetic_bombAI::UpdateAI(), boss_lord_marrowgar::UpdateAI(), boss_sindragosa::boss_sindragosaAI::UpdateAI(), npc_rimefang::npc_rimefangAI::UpdateAI(), npc_valithria_cloud::npc_valithria_cloudAI::UpdateAI(), boss_malygos::boss_malygosAI::UpdateAI(), boss_stormcaller_brundir::boss_stormcaller_brundirAI::UpdateAI(), boss_mimiron::boss_mimironAI::UpdateAI(), boss_razorscale::boss_razorscaleAI::UpdateAI(), boss_thorim_sif::boss_thorim_sifAI::UpdateAI(), npc_mature_netherwing_drake::npc_mature_netherwing_drakeAI::UpdateAI(), npc_pet_gen_plump_turkey::UpdateAI(), and PetAI::UpdateAI().

◆ StopMovingOnCurrentPos()

void Unit::StopMovingOnCurrentPos ( )
16762{
16764
16765 // not need send any packets if not in world
16766 if (!IsInWorld())
16767 return;
16768
16769 DisableSpline(); // pussywizard: required so Launch() won't recalculate position from previous spline
16770 Movement::MoveSplineInit init(this);
16771 init.MoveTo(GetPositionX(), GetPositionY(), GetPositionZ());
16772 init.SetFacing(GetOrientation());
16773 init.Launch();
16774}

References ClearUnitState(), DisableSpline(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), Object::IsInWorld(), Movement::MoveSplineInit::Launch(), Movement::MoveSplineInit::MoveTo(), Movement::MoveSplineInit::SetFacing(), and UNIT_STATE_MOVING.

Referenced by npc_high_overlord_saurfang_icc::npc_high_overlord_saurfangAI::DoAction(), npc_muradin_bronzebeard_icc::npc_muradin_bronzebeard_iccAI::DoAction(), brann_bronzebeard::brann_bronzebeardAI::DoAction(), boss_illidan_stormrage::DoAction(), npc_maiev_illidan::DoAction(), boss_alar::DoDiveBomb(), UtherBatteredHiltEvent::Execute(), WorldSession::HandlePetActionHelper(), npc_valkyr_shadowguard::npc_valkyr_shadowguardAI::HandleSpeedChangeIfNeeded(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), npc_escortAI::MovementInform(), SmartAI::MovepointReached(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_ulduar::instance_ulduar_InstanceMapScript::OnCreatureCreate(), boss_janalai::Reset(), boss_skadi::boss_skadiAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), SetRooted(), boss_devourer_of_souls::boss_devourer_of_soulsAI::SpellHitTarget(), Creature::Update(), npc_rookery_hatcher::npc_rookery_hatcherAI::UpdateAI(), npc_vaelastrasz_the_red::npc_vaelastrasz_the_redAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), and npc_vortex_ride::npc_vortex_rideAI::UpdateAI().

◆ Talk() [1/2]

void Unit::Talk ( std::string_view  text,
ChatMsg  msgType,
Language  language,
float  textRange,
WorldObject const *  target 
)
virtual
20989{
20990 Acore::CustomChatTextBuilder builder(this, msgType, text, language, target);
20993 Cell::VisitWorldObjects(this, worker, textRange);
20994}
Definition ChatTextBuilder.h:49
Definition GridNotifiers.h:1733
Definition GridNotifiers.h:582
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius)
Definition CellImpl.h:175

References Cell::VisitWorldObjects().

Referenced by spell_inoculate_nestlewood_owlkin::HandleEffectRemove(), and spell_the_flag_of_ownership::HandleScript().

◆ Talk() [2/2]

void Unit::Talk ( uint32  textId,
ChatMsg  msgType,
float  textRange,
WorldObject const *  target 
)
virtual
21041{
21042 if (!sObjectMgr->GetBroadcastText(textId))
21043 {
21044 LOG_ERROR("entities.unit", "Unit::Talk: `broadcast_text` (ID: {}) was not found", textId);
21045 return;
21046 }
21047
21048 Acore::BroadcastTextBuilder builder(this, msgType, textId, getGender(), target);
21051 Cell::VisitWorldObjects(this, worker, textRange);
21052}
Definition ChatTextBuilder.h:31
uint8 getGender() const
Definition Unit.h:798

References getGender(), LOG_ERROR, sObjectMgr, and Cell::VisitWorldObjects().

◆ TauntApply()

void Unit::TauntApply ( Unit victim)
14755{
14756 ASSERT(IsCreature());
14757
14758 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14759 return;
14760
14761 if (!CanHaveThreatList())
14762 return;
14763
14764 Creature* creature = ToCreature();
14765
14766 if (creature->HasReactState(REACT_PASSIVE))
14767 return;
14768
14769 Unit* target = GetVictim();
14770 if (target && target == taunter)
14771 return;
14772
14773 SetInFront(taunter);
14774 SetGuidValue(UNIT_FIELD_TARGET, taunter->GetGUID());
14775
14776 if (creature->IsAIEnabled)
14777 creature->AI()->AttackStart(taunter);
14778
14779 //m_ThreatMgr.tauntApply(taunter);
14780}
void SetInFront(WorldObject const *target)
Definition Unit.cpp:20360

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), REACT_PASSIVE, Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and boss_razorgore::boss_razorgoreAI::OnCharmed().

◆ TauntFadeOut()

void Unit::TauntFadeOut ( Unit taunter)
14785{
14786 ASSERT(IsCreature());
14787
14788 if (!taunter || (taunter->IsPlayer() && taunter->ToPlayer()->IsGameMaster()))
14789 return;
14790
14791 if (!CanHaveThreatList())
14792 return;
14793
14794 Creature* creature = ToCreature();
14795
14796 if (creature->HasReactState(REACT_PASSIVE))
14797 return;
14798
14799 Unit* target = GetVictim();
14800 if (!target || target != taunter)
14801 return;
14802
14804 {
14805 if (creature->IsAIEnabled)
14807 return;
14808 }
14809
14810 target = creature->SelectVictim(); // might have more taunt auras remaining
14811
14812 if (target && target != taunter)
14813 {
14815 SetInFront(target);
14816 if (creature->IsAIEnabled)
14817 creature->AI()->AttackStart(target);
14818 }
14819}
@ EVADE_REASON_NO_HOSTILES
Definition CreatureAI.h:89
virtual void EnterEvadeMode(EvadeReason why=EVADE_REASON_OTHER)
Definition CreatureAI.cpp:210
Unit * SelectVictim()
Definition Unit.cpp:14823
bool isThreatListEmpty() const
Definition ThreatMgr.h:224

References Creature::AI(), ASSERT, UnitAI::AttackStart(), CanHaveThreatList(), CreatureAI::EnterEvadeMode(), CreatureAI::EVADE_REASON_NO_HOSTILES, Object::GetGUID(), GetVictim(), Creature::HasReactState(), IsAIEnabled, Object::IsCreature(), Player::IsGameMaster(), Object::IsPlayer(), ThreatMgr::isThreatListEmpty(), m_ThreatMgr, REACT_PASSIVE, Creature::SelectVictim(), Object::SetGuidValue(), SetInFront(), Object::ToCreature(), Object::ToPlayer(), and UNIT_FIELD_TARGET.

Referenced by AuraEffect::HandleModTaunt(), and npc_deaths_fel_cannon::npc_deaths_fel_cannonAI::UpdateAI().

◆ TextEmote() [1/2]

◆ TextEmote() [2/2]

void Unit::TextEmote ( uint32  textId,
WorldObject const *  target = nullptr,
bool  isBossEmote = false 
)
virtual

Reimplemented in Player.

21065{
21066 Talk(textId, isBossEmote ? CHAT_MSG_RAID_BOSS_EMOTE : CHAT_MSG_MONSTER_EMOTE, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_TEXTEMOTE), target);
21067}

References CHAT_MSG_MONSTER_EMOTE, CHAT_MSG_RAID_BOSS_EMOTE, CONFIG_LISTEN_RANGE_TEXTEMOTE, and sWorld.

◆ ToPet()

◆ ToTempSummon() [1/2]

TempSummon * Unit::ToTempSummon ( )
inline
686{ if (IsSummon()) return reinterpret_cast<TempSummon*>(this); else return nullptr; }

References IsSummon().

Referenced by CreatureAI::_EnterEvadeMode(), _ExitVehicle(), npc_living_mojo::npc_living_mojoAI::AttackStart(), WorldObject::CanSeeOrDetect(), Spell::CheckCast(), Spell::CheckEffectTarget(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::DamageTaken(), npc_tiger_matriarch::npc_tiger_matriarchAI::DamageTaken(), Creature::DespawnOnEvade(), Creature::DespawnOrUnsummon(), npc_bone_spike::npc_bone_spikeAI::DoAction(), boss_sindragosa::boss_sindragosaAI::DoAction(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::DoAction(), ThreatMgr::DoAddThreat(), Spell::EffectScriptEffect(), npc_phantom_hallucination::npc_phantom_hallucinationAI::EnterEvadeMode(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::EnterEvadeMode(), SuckBackEvent::Execute(), npc_raging_flames::FixateRandomTarget(), boss_headless_horseman_head::GetOwner(), GetSpellModOwner(), npc_infra_green_bomber_generic::npc_infra_green_bomber_genericAI::GetSummoner(), CreatureAI::GetSummoner(), Creature::GetSummonerGUID(), SmartScript::GetTargets(), WorldSession::HandleDismissCritter(), spell_pilgrims_bounty_pass_generic::HandleDummy(), WorldSession::HandlePetActionHelper(), spell_pri_lightwell::HandleScriptEffect(), spell_q11026_a11051_banish_the_demons::HandleScriptEffect(), npc_hourglass_of_eternity::npc_hourglass_of_eternityAI::InitializeAI(), npc_bushwhacker::npc_bushwhackerAI::InitializeAI(), npc_pet_gen_imp_in_a_bottle::InitializeAI(), npc_pet_pri_lightwell::InitializeAI(), TempSummon::InitStats(), SpellClickInfo::IsFitToRequirements(), Creature::IsUpdateNeeded(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::JustDied(), boss_black_knight::boss_black_knightAI::JustDied(), boss_tyrannus::boss_tyrannusAI::JustDied(), npc_raging_spirit::npc_raging_spiritAI::JustDied(), boss_freya_iron_root::boss_freya_iron_rootAI::JustDied(), boss_yoggsaron_influence_tentacle::boss_yoggsaron_influence_tentacleAI::JustDied(), npc_counselor_talbot::npc_counselor_talbotAI::JustDied(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::JustDied(), boss_essence_of_anger::boss_essence_of_angerAI::JustDied(), npc_pet_dk_ghoul::JustDied(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::JustEngagedWith(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::JustEngagedWith(), boss_yoggsaron_cloud::boss_yoggsaron_cloudAI::JustSummoned(), npc_frosthound::npc_frosthoundAI::JustSummoned(), boss_halion::boss_halionAI::JustSummoned(), boss_lady_deathwhisper::boss_lady_deathwhisperAI::JustSummoned(), npc_collapsing_star::npc_collapsing_starAI::JustSummoned(), npc_algalon_worm_hole::npc_algalon_worm_holeAI::JustSummoned(), boss_supremus::JustSummoned(), Kill(), npc_tiger_matriarch::npc_tiger_matriarchAI::KilledUnit(), npc_netherspite_infernal::KilledUnit(), npc_living_mojo::npc_living_mojoAI::MoveInLineOfSight(), npc_jenny::MoveInLineOfSight(), WaypointMovementGenerator< Creature >::MovementInform(), npc_frostbrood_skytalon::npc_frostbrood_skytalonAI::MovementInform(), npc_leryssa::npc_leryssaAI::MovementInform(), npc_injured_7th_legion_soldier::npc_injured_7th_legion_soldierAI::MovementInform(), npc_balance_of_light_and_shadow::npc_balance_of_light_and_shadowAI::MovementInform(), npc_marzon_silent_blade::npc_marzon_silent_bladeAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::MovementInform(), npc_attracted_reef_bull::npc_attracted_reef_bullAI::npc_attracted_reef_bullAI(), npc_batrider::npc_batrider(), npc_claw_tentacle::npc_claw_tentacle(), npc_eye_tentacle::npc_eye_tentacle(), npc_giant_claw_tentacle::npc_giant_claw_tentacle(), npc_giant_eye_tentacle::npc_giant_eye_tentacle(), npc_midsummer_bonfire::npc_midsummer_bonfire(), npc_midsummer_ribbon_pole_target::npc_midsummer_ribbon_pole_target(), npc_pet_gen_soul_trader_beacon::npc_pet_gen_soul_trader_beacon(), BattlefieldWG::OnCreatureCreate(), instance_blackwing_lair::instance_blackwing_lair_InstanceMapScript::OnCreatureCreate(), npc_wormhole::OnGossipHello(), RemoveAllControlled(), RemoveAllMinionsByEntry(), spell_gen_defend::RemoveDummyFromDriver(), npc_anub_ar_crusher::npc_anub_ar_crusherAI::Reset(), npc_raging_spirit::npc_raging_spiritAI::Reset(), npc_stormforged_lieutenant::npc_stormforged_lieutenantAI::Reset(), npc_future_you::npc_future_youAI::Reset(), npc_plaguehound_tracker::npc_plaguehound_trackerAI::Reset(), npc_voidtraveler::Reset(), npc_pet_gen_argent_pony_bridle::Reset(), Spell::SelectImplicitCasterObjectTargets(), Creature::SelectVictim(), Spell::SendSpellGo(), Spell::SendSpellStart(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_ulduar_flames_spread::npc_ulduar_flames_spreadAI::SpellHit(), npc_pilgrims_bounty_plate::SpellHit(), boss_the_lich_king::boss_the_lich_kingAI::SummonedCreatureDies(), instance_icecrown_citadel::instance_icecrown_citadel_InstanceMapScript::Update(), npc_valkyr_battle_maiden::npc_valkyr_battle_maidenAI::UpdateAI(), npc_love_in_air_snivel_real::UpdateAI(), npc_tiger_matriarch_credit::npc_tiger_matriarch_creditAI::UpdateAI(), npc_tiger_matriarch::npc_tiger_matriarchAI::UpdateAI(), npc_living_mojo::npc_living_mojoAI::UpdateAI(), npc_bone_spike::npc_bone_spikeAI::UpdateAI(), npc_little_ooze::npc_little_oozeAI::UpdateAI(), npc_raging_spirit::npc_raging_spiritAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_freya_ward::npc_freya_wardAI::UpdateAI(), npc_ulduar_flash_freeze::npc_ulduar_flash_freezeAI::UpdateAI(), npc_vh_void_sentry::npc_vh_void_sentryAI::UpdateAI(), npc_captured_beryl_sorcerer::npc_captured_beryl_sorcererAI::UpdateAI(), npc_jenny::UpdateFollowerAI(), Player::VehicleSpellInitialize(), and npc_frosthound::npc_frosthoundAI::WaypointReached().

◆ ToTempSummon() [2/2]

const TempSummon * Unit::ToTempSummon ( ) const
inline
687{ if (IsSummon()) return reinterpret_cast<const TempSummon*>(this); else return nullptr; }

References IsSummon().

◆ ToTotem()

Totem * Unit::ToTotem ( )
inline
685{ if (IsTotem()) return reinterpret_cast<Totem*>(this); else return nullptr; }
Definition Totem.h:51

References IsTotem().

Referenced by _UnapplyAura(), Spell::EffectDestroyAllTotems(), WorldSession::HandleTotemDestroyed(), SetMinion(), Spell::SummonGuardian(), and TotemAI::UpdateAI().

◆ TriggerAurasProcOnEvent() [1/3]

void Unit::TriggerAurasProcOnEvent ( CalcDamageInfo damageInfo)
16616{
16617 DamageInfo dmgInfo = DamageInfo(damageInfo);
16618 TriggerAurasProcOnEvent(nullptr, nullptr, damageInfo.target, damageInfo.procAttacker, damageInfo.procVictim, 0, 0, damageInfo.procEx, nullptr, &dmgInfo, nullptr);
16619}
void TriggerAurasProcOnEvent(CalcDamageInfo &damageInfo)
Definition Unit.cpp:16615

References CalcDamageInfo::procAttacker, CalcDamageInfo::procEx, CalcDamageInfo::procVictim, CalcDamageInfo::target, and TriggerAurasProcOnEvent().

Referenced by TriggerAurasProcOnEvent(), and TriggerAurasProcOnEvent().

◆ TriggerAurasProcOnEvent() [2/3]

void Unit::TriggerAurasProcOnEvent ( ProcEventInfo eventInfo,
std::list< AuraApplication * > &  procAuras 
)
16641{
16642 for (std::list<AuraApplication*>::iterator itr = aurasTriggeringProc.begin(); itr != aurasTriggeringProc.end(); ++itr)
16643 {
16644 if (!(*itr)->GetRemoveMode())
16645 (*itr)->GetBase()->TriggerProcOnEvent(*itr, eventInfo);
16646 }
16647}

◆ TriggerAurasProcOnEvent() [3/3]

void Unit::TriggerAurasProcOnEvent ( std::list< AuraApplication * > *  myProcAuras,
std::list< AuraApplication * > *  targetProcAuras,
Unit actionTarget,
uint32  typeMaskActor,
uint32  typeMaskActionTarget,
uint32  spellTypeMask,
uint32  spellPhaseMask,
uint32  hitMask,
Spell spell,
DamageInfo damageInfo,
HealInfo healInfo 
)
16622{
16623 // prepare data for self trigger
16624 ProcEventInfo myProcEventInfo = ProcEventInfo(this, actionTarget, actionTarget, typeMaskActor, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16625 std::list<AuraApplication*> myAurasTriggeringProc;
16626 GetProcAurasTriggeredOnEvent(myAurasTriggeringProc, myProcAuras, myProcEventInfo);
16627
16628 // prepare data for target trigger
16629 ProcEventInfo targetProcEventInfo = ProcEventInfo(this, actionTarget, this, typeMaskActionTarget, spellTypeMask, spellPhaseMask, hitMask, spell, damageInfo, healInfo);
16630 std::list<AuraApplication*> targetAurasTriggeringProc;
16631 if (typeMaskActionTarget)
16632 GetProcAurasTriggeredOnEvent(targetAurasTriggeringProc, targetProcAuras, targetProcEventInfo);
16633
16634 TriggerAurasProcOnEvent(myProcEventInfo, myAurasTriggeringProc);
16635
16636 if (typeMaskActionTarget)
16637 TriggerAurasProcOnEvent(targetProcEventInfo, targetAurasTriggeringProc);
16638}
void GetProcAurasTriggeredOnEvent(std::list< AuraApplication * > &aurasTriggeringProc, std::list< AuraApplication * > *procAuras, ProcEventInfo eventInfo)
Definition Unit.cpp:16585

References GetProcAurasTriggeredOnEvent(), and TriggerAurasProcOnEvent().

◆ UnsummonAllTotems()

void Unit::UnsummonAllTotems ( bool  onDeath = false)
11289{
11290 for (uint8 i = 0; i < MAX_SUMMON_SLOT; ++i)
11291 {
11292 if (!m_SummonSlot[i])
11293 {
11294 continue;
11295 }
11296
11297 if (Creature* OldTotem = GetMap()->GetCreature(m_SummonSlot[i]))
11298 {
11299 if (OldTotem->IsSummon())
11300 {
11301 if (!(onDeath && !IsPlayer() && OldTotem->IsGuardian()))
11302 {
11303 OldTotem->ToTempSummon()->UnSummon();
11304 }
11305 }
11306 }
11307 }
11308}

References WorldObject::GetMap(), Object::IsPlayer(), m_SummonSlot, and MAX_SUMMON_SLOT.

Referenced by Player::ActivateSpec(), RemoveFromWorld(), and setDeathState().

◆ Update()

void Unit::Update ( uint32  time)
overridevirtual

Reimplemented from WorldObject.

384{
385 sScriptMgr->OnUnitUpdate(this, p_time);
386
387 // WARNING! Order of execution here is important, do not change.
388 // Spells must be processed with event system BEFORE they go to _UpdateSpells.
389 // Or else we may have some SPELL_STATE_FINISHED spells stalled in pointers, that is bad.
390 WorldObject::Update(p_time);
391
392 if (!IsInWorld())
393 return;
394
395 // pussywizard:
396 if (!IsPlayer() || (!ToPlayer()->IsBeingTeleported() && !bRequestForcedVisibilityUpdate))
397 {
399 {
401 {
403 //ExecuteDelayedUnitRelocationEvent();
405 }
406 else
408 }
410 {
411 if (m_delayed_unit_ai_notify_timer <= p_time)
412 {
415 }
416 else
418 }
419 }
420
421 _UpdateSpells( p_time );
422
423 if (CanHaveThreatList() && GetThreatMgr().isNeedUpdateToClient(p_time))
425
426 // update combat timer only for players and pets (only pets with PetAI)
428 {
429 // Check UNIT_STATE_MELEE_ATTACKING or UNIT_STATE_CHASE (without UNIT_STATE_FOLLOW in this case) so pets can reach far away
430 // targets without stopping half way there and running off.
431 // These flags are reset after target dies or another command is given.
433 {
434 // m_CombatTimer set at aura start and it will be freeze until aura removing
435 if (m_CombatTimer <= p_time)
437 else
438 m_CombatTimer -= p_time;
439 }
440 }
441
444 {
445 while (!extraAttacksTargets.empty())
446 {
447 auto itr = extraAttacksTargets.begin();
448 ObjectGuid targetGuid = itr->first;
449 uint32 count = itr->second;
450 extraAttacksTargets.erase(itr);
451 if (Unit* victim = ObjectAccessor::GetUnit(*this, targetGuid))
452 {
454 || victim->IsWithinMeleeRange(this))
455 {
456 HandleProcExtraAttackFor(victim, count);
457 }
458 }
459 }
461 }
462
463 // not implemented before 3.0.2
464 // xinef: if attack time > 0, reduce by diff
465 // if on next update, attack time < 0 assume player didnt attack - set to 0
466 bool suspendAttackTimer = false;
467 bool suspendRangedAttackTimer = false;
469 {
470 for (Spell* spell : m_currentSpells)
471 {
472 if (spell)
473 {
474 if (spell->GetSpellInfo()->HasAttribute(SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS))
475 {
476 if (spell->IsChannelActive())
477 {
478 suspendRangedAttackTimer = true;
479 }
480
481 suspendAttackTimer = true;
482 break;
483 }
484 }
485 }
486 }
487
488 if (!suspendAttackTimer)
489 {
490 if (int32 base_attack = getAttackTimer(BASE_ATTACK))
491 {
492 setAttackTimer(BASE_ATTACK, base_attack > 0 ? base_attack - (int32) p_time : 0);
493 }
494
495 if (int32 off_attack = getAttackTimer(OFF_ATTACK))
496 {
497 setAttackTimer(OFF_ATTACK, off_attack > 0 ? off_attack - (int32) p_time : 0);
498 }
499 }
500
501 if (!suspendRangedAttackTimer)
502 {
503 if (int32 ranged_attack = getAttackTimer(RANGED_ATTACK))
504 {
505 setAttackTimer(RANGED_ATTACK, ranged_attack > 0 ? ranged_attack - (int32)p_time : 0);
506 }
507 }
508
509 // update abilities available only for fraction of time
510 UpdateReactives(p_time);
511
515
516 UpdateSplineMovement(p_time);
517 GetMotionMaster()->UpdateMotion(p_time);
518
520}
@ AURA_STATE_HEALTH_ABOVE_75_PERCENT
Definition SharedDefines.h:1315
bool IsEmpty() const
Definition LinkedList.h:97
std::unordered_set< Unit * > i_objectsForDelayedVisibility
Definition Map.h:231
void UpdateMotion(uint32 diff)
Definition MotionMaster.cpp:104
void _UpdateSpells(uint32 time)
Definition Unit.cpp:3872
void UpdateSplineMovement(uint32 t_diff)
Definition Unit.cpp:576
void UpdateReactives(uint32 p_time)
Definition Unit.cpp:17012
void ExecuteDelayedUnitAINotifyEvent()
Definition Unit.cpp:20349
void HandleProcExtraAttackFor(Unit *victim, uint32 count)
Definition Unit.cpp:2786
void SendThreatListUpdate()
Definition Unit.cpp:19897
virtual void Update(uint32 diff)
Definition Object.cpp:1061

References _lastDamagedTargetGuid, _lastExtraAttackSpell, _UpdateSpells(), AURA_STATE_HEALTH_ABOVE_75_PERCENT, AURA_STATE_HEALTHLESS_20_PERCENT, AURA_STATE_HEALTHLESS_35_PERCENT, BASE_ATTACK, bRequestForcedVisibilityUpdate, CanHaveThreatList(), ClearInCombat(), ObjectGuid::Empty, ExecuteDelayedUnitAINotifyEvent(), extraAttacksTargets, WorldObject::FindMap(), getAttackTimer(), GetMotionMaster(), GetThreatMgr(), ObjectAccessor::GetUnit(), HandleProcExtraAttackFor(), HasUnitState(), HasUnitTypeMask(), HealthAbovePct(), HealthBelowPct(), Map::i_objectsForDelayedVisibility, InvalidateValuesUpdateCache(), IsAlive(), IsControlledByPlayer(), LinkedListHead::IsEmpty(), IsInCombat(), Object::IsInWorld(), IsPet(), Object::IsPlayer(), m_CombatTimer, m_currentSpells, m_delayed_unit_ai_notify_timer, m_delayed_unit_relocation_timer, m_HostileRefMgr, ModifyAuraState(), OFF_ATTACK, RANGED_ATTACK, SendThreatListUpdate(), setAttackTimer(), SPELL_ATTR2_DO_NOT_RESET_COMBAT_TIMERS, SPELL_HACK_AND_SLASH, SPELL_SWORD_SPECIALIZATION, sScriptMgr, Object::ToPlayer(), UNIT_MASK_CONTROLLABLE_GUARDIAN, UNIT_STATE_CASTING, WorldObject::Update(), MotionMaster::UpdateMotion(), UpdateReactives(), and UpdateSplineMovement().

Referenced by Creature::Update(), and Player::Update().

◆ UpdateAllResistances()

void Unit::UpdateAllResistances ( )
virtual

◆ UpdateAllStats()

virtual bool Unit::UpdateAllStats ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

◆ UpdateArmor()

virtual void Unit::UpdateArmor ( )
pure virtual

◆ UpdateAttackPowerAndDamage()

virtual void Unit::UpdateAttackPowerAndDamage ( bool  ranged = false)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateAuraForGroup()

void Unit::UpdateAuraForGroup ( uint8  slot)
17242{
17243 if (slot >= MAX_AURAS) // slot not found, return
17244 return;
17245 if (Player* player = ToPlayer())
17246 {
17247 if (player->GetGroup())
17248 {
17249 player->SetGroupUpdateFlag(GROUP_UPDATE_FLAG_AURAS);
17250 player->SetAuraUpdateMaskForRaid(slot);
17251 }
17252 }
17253 else if (IsCreature() && IsPet())
17254 {
17255 Pet* pet = ((Pet*)this);
17256 if (pet->isControlled())
17257 {
17258 Unit* owner = GetOwner();
17259 if (owner && (owner->IsPlayer()) && owner->ToPlayer()->GetGroup())
17260 {
17262 pet->SetAuraUpdateMaskForRaid(slot);
17263 }
17264 }
17265 }
17266}
@ GROUP_UPDATE_FLAG_PET_AURAS
Definition Group.h:118
@ GROUP_UPDATE_FLAG_AURAS
Definition Group.h:109
#define MAX_AURAS
Definition SpellAuraDefines.h:21
void SetAuraUpdateMaskForRaid(uint8 slot)
Definition Pet.h:137

References Player::GetGroup(), GetOwner(), GROUP_UPDATE_FLAG_AURAS, GROUP_UPDATE_FLAG_PET_AURAS, Pet::isControlled(), Object::IsCreature(), IsPet(), Object::IsPlayer(), MAX_AURAS, Pet::SetAuraUpdateMaskForRaid(), Player::SetGroupUpdateFlag(), and Object::ToPlayer().

Referenced by RemoveVisibleAura(), and SetVisibleAura().

◆ UpdateCharmAI()

void Unit::UpdateCharmAI ( )
15861{
15862 if (IsPlayer())
15863 return;
15864
15865 if (i_disabledAI) // disabled AI must be primary AI
15866 {
15867 if (!IsCharmed())
15868 {
15869 delete i_AI;
15871 i_disabledAI = nullptr;
15872 }
15873 }
15874 else
15875 {
15876 if (IsCharmed())
15877 {
15879 if (isPossessed() || IsVehicle())
15880 i_AI = new PossessedAI(ToCreature());
15881 else
15882 i_AI = new PetAI(ToCreature());
15883 }
15884 }
15885}
Definition PetAI.h:47
Definition PassiveAI.h:37

References i_AI, i_disabledAI, IsCharmed(), Object::IsPlayer(), isPossessed(), IsVehicle(), and Object::ToCreature().

Referenced by Creature::Update().

◆ UpdateDamagePhysical()

void Unit::UpdateDamagePhysical ( WeaponAttackType  attType)
virtual

Reimplemented in Guardian, and Totem.

61{
62 float totalMin = 0.f;
63 float totalMax = 0.f;
64
65 float tmpMin, tmpMax;
66 for (uint8 i = 0; i < MAX_ITEM_PROTO_DAMAGES; ++i)
67 {
68 CalculateMinMaxDamage(attType, false, true, tmpMin, tmpMax, i);
69 totalMin += tmpMin;
70 totalMax += tmpMax;
71 }
72
73 switch (attType)
74 {
75 case BASE_ATTACK:
76 default:
79 break;
80 case OFF_ATTACK:
83 break;
84 case RANGED_ATTACK:
87 break;
88 }
89}
void SetStatFloatValue(uint16 index, float value)
Definition Object.cpp:790

References BASE_ATTACK, CalculateMinMaxDamage(), MAX_ITEM_PROTO_DAMAGES, OFF_ATTACK, RANGED_ATTACK, Object::SetStatFloatValue(), UNIT_FIELD_MAXDAMAGE, UNIT_FIELD_MAXOFFHANDDAMAGE, UNIT_FIELD_MAXRANGEDDAMAGE, UNIT_FIELD_MINDAMAGE, UNIT_FIELD_MINOFFHANDDAMAGE, and UNIT_FIELD_MINRANGEDDAMAGE.

Referenced by Player::_ApplyAmmoBonuses(), Player::_ApplyWeaponDamage(), boss_twin_valkyrAI::boss_twin_valkyrAI(), AuraEffect::HandleAuraModDisarm(), AuraEffect::HandleModAttackSpeed(), HandleStatModifier(), npc_toc_enh_shaman::npc_toc_enh_shamanAI::npc_toc_enh_shamanAI(), Player::RemoveAmmo(), Creature::SetCanDualWield(), ScriptedAI::SetEquipmentSlots(), Creature::UpdateAttackPowerAndDamage(), and Player::UpdateAttackPowerAndDamage().

◆ UpdateHeight()

void Unit::UpdateHeight ( float  newZ)

Only server-side height update, does not broadcast to client.

19891{
19893 if (IsVehicle())
19895}
void RelocatePassengers()
Definition Vehicle.cpp:514

References Position::GetPositionX(), Position::GetPositionY(), GetVehicleKit(), IsVehicle(), Position::Relocate(), and Vehicle::RelocatePassengers().

Referenced by npc_dancing_flames::npc_dancing_flamesAI::Reset(), and SetHover().

◆ UpdateInterruptMask()

void Unit::UpdateInterruptMask ( )
769{
770 m_interruptMask = 0;
771 for (AuraApplicationList::const_iterator i = m_interruptableAuras.begin(); i != m_interruptableAuras.end(); ++i)
772 m_interruptMask |= (*i)->GetBase()->GetSpellInfo()->AuraInterruptFlags;
773
775 if (spell->getState() == SPELL_STATE_CASTING)
776 m_interruptMask |= spell->m_spellInfo->ChannelInterruptFlags;
777}

References CURRENT_CHANNELED_SPELL, m_currentSpells, m_interruptableAuras, m_interruptMask, and SPELL_STATE_CASTING.

Referenced by _UnapplyAura(), Spell::finish(), and RemoveAurasWithInterruptFlags().

◆ UpdateMaxHealth()

virtual void Unit::UpdateMaxHealth ( )
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateMaxPower()

virtual void Unit::UpdateMaxPower ( Powers  power)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ UpdateObjectVisibility()

◆ UpdateOrientation()

void Unit::UpdateOrientation ( float  orientation)

Only server-side orientation update, does not broadcast to client.

19883{
19884 SetOrientation(orientation);
19885 if (IsVehicle())
19887}

References GetVehicleKit(), IsVehicle(), Vehicle::RelocatePassengers(), and Position::SetOrientation().

Referenced by Spell::UpdateChanneledTargetList(), and UpdatePosition().

◆ UpdatePosition() [1/2]

bool Unit::UpdatePosition ( const Position pos,
bool  teleport = false 
)
inline

◆ UpdatePosition() [2/2]

bool Unit::UpdatePosition ( float  x,
float  y,
float  z,
float  ang,
bool  teleport = false 
)
virtual

Reimplemented in Player.

19845{
19846 if (!Acore::IsValidMapCoord(x, y, z, orientation))
19847 return false;
19848
19849 float old_orientation = GetOrientation();
19850 float current_z = GetPositionZ();
19851 bool turn = (old_orientation != orientation);
19852 bool relocated = (teleport || GetPositionX() != x || GetPositionY() != y || current_z != z);
19853
19854 if (!GetVehicle())
19855 {
19856 uint32 mask = 0;
19857 if (turn) mask |= AURA_INTERRUPT_FLAG_TURNING;
19858 if (relocated) mask |= AURA_INTERRUPT_FLAG_MOVE;
19859 if (mask)
19861 }
19862
19863 if (relocated)
19864 {
19865 if (IsPlayer())
19866 GetMap()->PlayerRelocation(ToPlayer(), x, y, z, orientation);
19867 else
19868 GetMap()->CreatureRelocation(ToCreature(), x, y, z, orientation);
19869 }
19870 else if (turn)
19871 {
19872 UpdateOrientation(orientation);
19873
19874 if (IsPlayer() && ToPlayer()->GetFarSightDistance())
19876 }
19877
19878 return (relocated || turn);
19879}
void PlayerRelocation(Player *, float x, float y, float z, float o)
Definition Map.cpp:771
void CreatureRelocation(Creature *creature, float x, float y, float z, float o)
Definition Map.cpp:793
void UpdateOrientation(float orientation)
Only server-side orientation update, does not broadcast to client.
Definition Unit.cpp:19882
bool IsValidMapCoord(float c)
Definition GridDefines.h:206

References AURA_INTERRUPT_FLAG_MOVE, AURA_INTERRUPT_FLAG_TURNING, Map::CreatureRelocation(), WorldObject::GetMap(), Position::GetOrientation(), Position::GetPositionX(), Position::GetPositionY(), Position::GetPositionZ(), GetVehicle(), Object::IsPlayer(), Acore::IsValidMapCoord(), Map::PlayerRelocation(), RemoveAurasWithInterruptFlags(), Object::ToCreature(), Object::ToPlayer(), UpdateObjectVisibility(), and UpdateOrientation().

Referenced by npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::DamageTaken(), boss_taldaram::DoAction(), npc_hor_spiritual_reflection::npc_hor_spiritual_reflectionAI::EnterEvadeMode(), UtherBatteredHiltEvent::Execute(), WorldSession::HandleMovementOpcodes(), WorldSession::HandleMoveRootAck(), WorldSession::HandleMoveUnRootAck(), boss_flame_leviathan::boss_flame_leviathanAI::InitializeAI(), boss_prince_keleseth_icc::boss_prince_kelesethAI::JustDied(), boss_prince_taldaram_icc::boss_prince_taldaramAI::JustDied(), boss_prince_valanar_icc::boss_prince_valanarAI::JustDied(), boss_cyanigosa::boss_cyanigosaAI::JustDied(), boss_the_lich_king::boss_the_lich_kingAI::JustSummoned(), boss_algalon_the_observer::boss_algalon_the_observerAI::JustSummoned(), boss_harbinger_skyriss::JustSummoned(), boss_icehowl::boss_icehowlAI::MovementInform(), NearTeleportTo(), npc_ulduar_magnetic_core::npc_ulduar_magnetic_coreAI::npc_ulduar_magnetic_coreAI(), instance_halls_of_reflection::instance_halls_of_reflection_InstanceMapScript::OnCreatureCreate(), instance_culling_of_stratholme::instance_culling_of_stratholme_InstanceMapScript::Reposition(), instance_old_hillsbrad::instance_old_hillsbrad_InstanceMapScript::Reposition(), boss_skadi::boss_skadiAI::Reset(), npc_imprisoned_beryl_sorcerer::npc_imprisoned_beryl_sorcererAI::Reset(), npc_q24545_lich_king::npc_q24545_lich_kingAI::Reset(), npc_escortAI::SetNextWaypoint(), npc_escortAI::SetNextWaypoint(), npc_your_inner_turmoil::npc_your_inner_turmoilAI::setphase(), npc_frost_sphere::npc_frost_sphereAI::UpdateAI(), boss_jormungarAI::UpdateAI(), npc_strangulate_vehicle::npc_strangulate_vehicleAI::UpdateAI(), npc_vortex_ride::npc_vortex_rideAI::UpdateAI(), boss_flame_leviathan::boss_flame_leviathanAI::UpdateAI(), npc_ulduar_aerial_command_unit::npc_ulduar_aerial_command_unitAI::UpdateAI(), Player::UpdatePosition(), and UpdateSplinePosition().

◆ UpdateReactives()

void Unit::UpdateReactives ( uint32  p_time)
17013{
17014 for (uint8 i = 0; i < MAX_REACTIVE; ++i)
17015 {
17016 ReactiveType reactive = ReactiveType(i);
17017
17018 if (!m_reactiveTimer[reactive])
17019 continue;
17020
17021 if (m_reactiveTimer[reactive] <= p_time)
17022 {
17023 m_reactiveTimer[reactive] = 0;
17024
17025 switch (reactive)
17026 {
17027 case REACTIVE_DEFENSE:
17030 break;
17034 break;
17035 case REACTIVE_OVERPOWER:
17037 {
17039 }
17040 break;
17042 if (IsHunterPet())
17044 break;
17045 default:
17046 break;
17047 }
17048 }
17049 else
17050 {
17051 m_reactiveTimer[reactive] -= p_time;
17052 }
17053 }
17054}
ReactiveType
Definition Unit.h:594

References AURA_STATE_DEFENSE, AURA_STATE_HUNTER_PARRY, CLASS_CONTEXT_ABILITY_REACTIVE, CLASS_HUNTER, CLASS_WARRIOR, ClearComboPoints(), HasAuraState(), IsClass(), IsHunterPet(), m_reactiveTimer, MAX_REACTIVE, ModifyAuraState(), REACTIVE_DEFENSE, REACTIVE_HUNTER_PARRY, REACTIVE_OVERPOWER, and REACTIVE_WOLVERINE_BITE.

Referenced by Update().

◆ UpdateResistances()

virtual void Unit::UpdateResistances ( uint32  school)
pure virtual

Implemented in Creature, Player, and Totem.

Referenced by HandleStatModifier(), and UpdateAllResistances().

◆ UpdateSpeed()

void Unit::UpdateSpeed ( UnitMoveType  mtype,
bool  forced 
)
Todo:
possible affect only on MOVE_RUN
14341{
14342 int32 main_speed_mod = 0;
14343 float stack_bonus = 1.0f;
14344 float non_stack_bonus = 1.0f;
14345
14346 switch (mtype)
14347 {
14348 // Only apply debuffs
14349 case MOVE_FLIGHT_BACK:
14350 case MOVE_RUN_BACK:
14351 case MOVE_SWIM_BACK:
14352 case MOVE_WALK:
14353 break;
14354 case MOVE_RUN:
14355 {
14356 if (IsMounted()) // Use on mount auras
14357 {
14361 }
14362 else
14363 {
14367 }
14368 break;
14369 }
14370 case MOVE_SWIM:
14371 {
14372 // xinef: check for forced_speed_mod of sea turtle
14374 for (Unit::AuraEffectList::const_iterator itr = swimAuras.begin(); itr != swimAuras.end(); ++itr)
14375 {
14376 // xinef: sea turtle only, it is not affected by any increasing / decreasing effects
14377 if ((*itr)->GetId() == 64731 /*SPELL_SEA_TURTLE*/)
14378 {
14379 SetSpeed(mtype, AddPct(non_stack_bonus, (*itr)->GetAmount()), forced);
14380 return;
14381 }
14382 else if (
14383 // case: increase speed
14384 ((*itr)->GetAmount() > 0 && (*itr)->GetAmount() > main_speed_mod) ||
14385 // case: decrease speed
14386 ((*itr)->GetAmount() < 0 && (*itr)->GetAmount() < main_speed_mod)
14387 )
14388 {
14389 main_speed_mod = (*itr)->GetAmount();
14390 }
14391 }
14392 break;
14393 }
14394 case MOVE_FLIGHT:
14395 {
14396 if (IsCreature() && IsControlledByPlayer()) // not sure if good for pet
14397 {
14400
14401 // for some spells this mod is applied on vehicle owner
14402 int32 owner_speed_mod = 0;
14403
14404 if (Unit* owner = GetCharmer())
14405 owner_speed_mod = owner->GetMaxPositiveAuraModifier(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
14406
14407 main_speed_mod = std::max(main_speed_mod, owner_speed_mod);
14408 }
14409 else if (IsMounted())
14410 {
14414 }
14415 else // Use not mount (shapeshift for example) auras (should stack)
14416 {
14420 }
14421
14422 // Update speed for vehicle if available
14423 if (IsPlayer() && GetVehicle())
14425 break;
14426 }
14427 default:
14428 LOG_ERROR("entities.unit", "Unit::UpdateSpeed: Unsupported move type ({})", mtype);
14429 return;
14430 }
14431
14432 // now we ready for speed calculation
14433 float speed = std::max(non_stack_bonus, stack_bonus);
14434 if (main_speed_mod)
14435 AddPct(speed, main_speed_mod);
14436
14437 switch (mtype)
14438 {
14439 case MOVE_RUN:
14440 case MOVE_SWIM:
14441 case MOVE_FLIGHT:
14442 {
14443 // Set creature speed rate
14444 if (IsCreature())
14445 {
14446 if (IsPet() && ToPet()->isControlled() && IsControlledByPlayer())
14447 {
14448 // contant value for player pets
14449 speed *= 1.15f;
14450 }
14451 else
14452 {
14453 speed *= ToCreature()->GetCreatureTemplate()->speed_run; // at this point, MOVE_WALK is never reached
14454 }
14455 }
14456
14457 // Normalize speed by 191 aura SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED if need
14460 {
14461 if (Creature* creature = ToCreature())
14462 {
14463 uint32 immuneMask = creature->GetCreatureTemplate()->MechanicImmuneMask;
14464 if (immuneMask & (1 << (MECHANIC_SNARE - 1)) || immuneMask & (1 << (MECHANIC_DAZE - 1)))
14465 break;
14466 }
14467
14468 // Use speed from aura
14469 float max_speed = normalization / (IsControlledByPlayer() ? playerBaseMoveSpeed[mtype] : baseMoveSpeed[mtype]);
14470 if (speed > max_speed)
14471 speed = max_speed;
14472 }
14473 break;
14474 }
14475 default:
14476 break;
14477 }
14478
14479 int32 slowFromHealth = 0;
14480 Creature* creature = ToCreature();
14481 // ignore pets, player owned vehicles, and mobs immune to snare
14482 if (creature
14483 && !IsPet()
14484 && !(IsControlledByPlayer() && IsVehicle())
14486 && !(creature->IsDungeonBoss()))
14487 {
14488 // 1.6% for each % under 30.
14489 // use min(0, health-30) so that we don't boost mobs above 30.
14490 slowFromHealth = (int32) std::min(0.0f, (1.66f * (GetHealthPct() - 30.0f)));
14491 }
14492
14493 if (slowFromHealth)
14494 {
14495 AddPct(speed, slowFromHealth);
14496 }
14497
14498 // Apply strongest slow aura mod to speed
14500 if (slow)
14501 AddPct(speed, slow);
14502
14503 if (float minSpeedMod = (float)GetMaxPositiveAuraModifier(SPELL_AURA_MOD_MINIMUM_SPEED))
14504 {
14505 float base_speed = (IsCreature() ? ToCreature()->GetCreatureTemplate()->speed_run : 1.0f);
14506 float min_speed = base_speed * (minSpeedMod / 100.0f);
14507 if (speed < min_speed)
14508 speed = min_speed;
14509 }
14510
14511 SetSpeed(mtype, speed, forced);
14512}
@ MECHANIC_DAZE
Definition SharedDefines.h:1352
@ SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED
Definition SpellAuraDefines.h:269
@ SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:272
@ SPELL_AURA_MOD_INCREASE_SPEED
Definition SpellAuraDefines.h:94
@ SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS
Definition SpellAuraDefines.h:271
@ SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK
Definition SpellAuraDefines.h:235
@ SPELL_AURA_MOD_SPEED_NOT_STACK
Definition SpellAuraDefines.h:234
@ SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING
Definition SpellAuraDefines.h:273
@ SPELL_AURA_MOD_INCREASE_SWIM_SPEED
Definition SpellAuraDefines.h:121
@ SPELL_AURA_MOD_MINIMUM_SPEED
Definition SpellAuraDefines.h:368
@ SPELL_AURA_MOD_SPEED_ALWAYS
Definition SpellAuraDefines.h:192
@ SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING
Definition SpellAuraDefines.h:274
@ SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS
Definition SpellAuraDefines.h:193
@ SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED
Definition SpellAuraDefines.h:254
void SetSpeed(UnitMoveType mtype, float rate, bool forced=false)
Definition Unit.cpp:14519
float speed_run
Definition CreatureData.h:201

References AddPct(), baseMoveSpeed, GetAuraEffectsByType(), GetCharmer(), Creature::GetCreatureTemplate(), GetHealthPct(), GetMaxNegativeAuraModifier(), GetMaxPositiveAuraModifier(), GetTotalAuraModifier(), GetTotalAuraMultiplier(), GetVehicle(), GetVehicleBase(), Creature::HasMechanicTemplateImmunity(), IsControlledByPlayer(), Object::IsCreature(), Creature::IsDungeonBoss(), IsMounted(), IsPet(), Object::IsPlayer(), IsVehicle(), LOG_ERROR, MECHANIC_DAZE, MECHANIC_SNARE, MOVE_FLIGHT, MOVE_FLIGHT_BACK, MOVE_RUN, MOVE_RUN_BACK, MOVE_SWIM, MOVE_SWIM_BACK, MOVE_WALK, playerBaseMoveSpeed, SetSpeed(), CreatureTemplate::speed_run, SPELL_AURA_MOD_DECREASE_SPEED, SPELL_AURA_MOD_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_FLIGHT_SPEED_MOUNTED_NOT_STACKING, SPELL_AURA_MOD_FLIGHT_SPEED_NOT_STACKING, SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_FLIGHT_SPEED, SPELL_AURA_MOD_INCREASE_MOUNTED_SPEED, SPELL_AURA_MOD_INCREASE_SPEED, SPELL_AURA_MOD_INCREASE_SWIM_SPEED, SPELL_AURA_MOD_MINIMUM_SPEED, SPELL_AURA_MOD_MOUNTED_FLIGHT_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_ALWAYS, SPELL_AURA_MOD_MOUNTED_SPEED_NOT_STACK, SPELL_AURA_MOD_SPEED_ALWAYS, SPELL_AURA_MOD_SPEED_NOT_STACK, SPELL_AURA_USE_NORMAL_MOVEMENT_SPEED, Object::ToCreature(), ToPet(), and UpdateSpeed().

Referenced by Creature::DoFleeToGetAssistance(), AuraEffect::HandleAuraModDecreaseSpeed(), AuraEffect::HandleAuraModIncreaseFlightSpeed(), AuraEffect::HandleAuraModIncreaseSpeed(), AuraEffect::HandleAuraModIncreaseSwimSpeed(), AuraEffect::HandleAuraModUseNormalSpeed(), spell_brewfest_main_ram_buff::HandleEffectPeriodic(), RemoveCharmedBy(), SetHealth(), SetInCombatState(), SetSpeed(), and UpdateSpeed().

◆ UpdateSplineMovement()

void Unit::UpdateSplineMovement ( uint32  t_diff)
private
577{
578 if (movespline->Finalized())
579 return;
580
581 // xinef: process movementinform
582 // this code cant be placed inside EscortMovementGenerator, because we cant delete active MoveGen while it is updated
583 SplineHandler handler(this);
584 movespline->updateState(t_diff, handler);
585 // Xinef: Spline was cleared by StopMoving, return
586 if (!movespline->Initialized())
587 {
589 return;
590 }
591
592 bool arrived = movespline->Finalized();
593
594 if (arrived)
595 {
597
598 if (movespline->HasAnimation() && IsCreature() && IsAlive())
600 }
601
602 // pussywizard: update always! not every 400ms, because movement generators need the actual position
603 //m_movesplineTimer.Update(t_diff);
604 //if (m_movesplineTimer.Passed() || arrived)
606}
@ UNIT_BYTES_1_OFFSET_ANIM_TIER
Definition UnitDefines.h:26
uint8 GetAnimationType() const
Definition MoveSpline.h:125
void updateState(int32 difftime, UpdateHandler &handler)
Definition MoveSpline.h:98
bool HasAnimation() const
Definition MoveSpline.h:124
Definition Unit.cpp:556

References DisableSpline(), Movement::MoveSpline::Finalized(), Movement::MoveSpline::GetAnimationType(), Movement::MoveSpline::HasAnimation(), Movement::MoveSpline::Initialized(), IsAlive(), Object::IsCreature(), movespline, Object::SetByteValue(), UNIT_BYTES_1_OFFSET_ANIM_TIER, UNIT_FIELD_BYTES_1, UpdateSplinePosition(), and Movement::MoveSpline::updateState().

Referenced by Update().

◆ UpdateSplinePosition()

void Unit::UpdateSplinePosition ( )
private
609{
610 //static uint32 const positionUpdateDelay = 400;
611
612 //m_movesplineTimer.Reset(positionUpdateDelay);
614
616 {
618 pos.m_positionX = loc.x;
619 pos.m_positionY = loc.y;
620 pos.m_positionZ = loc.z;
622
623 if (TransportBase* transport = GetDirectTransport())
624 transport->CalculatePassengerPosition(loc.x, loc.y, loc.z, &loc.orientation);
625 }
626
627 // Xinef: if we had spline running update orientation along with position
628 //if (HasUnitState(UNIT_STATE_CANNOT_TURN))
629 // loc.orientation = GetOrientation();
630
631 if (IsPlayer())
632 UpdatePosition(loc.x, loc.y, loc.z, loc.orientation);
633 else
634 ToCreature()->SetPosition(loc.x, loc.y, loc.z, loc.orientation);
635}
void SetPosition(float x, float y, float z, float o)
Definition Creature.cpp:3171
Location ComputePosition() const
Definition MoveSpline.cpp:26
bool onTransport
Definition MoveSpline.h:127
Definition VehicleDefines.h:130
TransportBase * GetDirectTransport() const
Definition Unit.cpp:18853
Position pos
Definition Object.h:309
Definition MoveSpline.h:27
float orientation
Definition MoveSpline.h:33
float m_positionZ
Definition Position.h:57
float m_positionX
Definition Position.h:55
float m_positionY
Definition Position.h:56

References Movement::MoveSpline::ComputePosition(), GetDirectTransport(), Object::IsPlayer(), WorldObject::m_movementInfo, Position::m_positionX, Position::m_positionY, Position::m_positionZ, movespline, Movement::MoveSpline::onTransport, Movement::Location::orientation, MovementInfo::TransportInfo::pos, Position::SetOrientation(), Creature::SetPosition(), Object::ToCreature(), MovementInfo::transport, and UpdatePosition().

Referenced by StopMoving(), and UpdateSplineMovement().

◆ UpdateStats()

virtual bool Unit::UpdateStats ( Stats  stat)
pure virtual

Implemented in Creature, Guardian, Player, and Totem.

Referenced by HandleStatModifier().

◆ Whisper() [1/2]

void Unit::Whisper ( std::string_view  text,
Language  language,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21012{
21013 if (!target)
21014 {
21015 return;
21016 }
21017
21019 WorldPacket data;
21020 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, language, this, target, text, 0, "", locale);
21021 target->SendDirectMessage(&data);
21022}
LocaleConstant
Definition Common.h:117
@ CHAT_MSG_MONSTER_WHISPER
Definition SharedDefines.h:3406
@ CHAT_MSG_RAID_BOSS_WHISPER
Definition SharedDefines.h:3433
static std::size_t BuildChatPacket(WorldPacket &data, ChatMsg chatType, Language language, ObjectGuid senderGUID, ObjectGuid receiverGUID, std::string_view message, uint8 chatTag, std::string const &senderName="", std::string const &receiverName="", uint32 achievementId=0, bool gmMessage=false, std::string const &channelName="")
Definition Chat.cpp:265
LocaleConstant GetSessionDbLocaleIndex() const
Definition WorldSession.h:517

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), and Player::SendDirectMessage().

Referenced by npc_commandscript::HandleNpcWhisperCommand(), spell_lich_king_whisper::HandleScript(), Map::ScriptsProcess(), and boss_zuramat::boss_zuramatAI::UpdateAI().

◆ Whisper() [2/2]

void Unit::Whisper ( uint32  textId,
Player target,
bool  isBossWhisper = false 
)
virtual

Reimplemented in Player.

21070{
21071 if (!target)
21072 {
21073 return;
21074 }
21075
21076 BroadcastText const* bct = sObjectMgr->GetBroadcastText(textId);
21077 if (!bct)
21078 {
21079 LOG_ERROR("entities.unit", "Unit::Whisper: `broadcast_text` was not {} found", textId);
21080 return;
21081 }
21082
21084 WorldPacket data;
21085 ChatHandler::BuildChatPacket(data, isBossWhisper ? CHAT_MSG_RAID_BOSS_WHISPER : CHAT_MSG_MONSTER_WHISPER, LANG_UNIVERSAL, this, target, bct->GetText(locale, getGender()), 0, "", locale);
21086 target->SendDirectMessage(&data);
21087}
Definition ObjectMgr.h:434

References ChatHandler::BuildChatPacket(), CHAT_MSG_MONSTER_WHISPER, CHAT_MSG_RAID_BOSS_WHISPER, getGender(), Player::GetSession(), WorldSession::GetSessionDbLocaleIndex(), BroadcastText::GetText(), LANG_UNIVERSAL, LOG_ERROR, Player::SendDirectMessage(), and sObjectMgr.

◆ Yell() [1/2]

void Unit::Yell ( std::string_view  text,
Language  language,
WorldObject const *  target = nullptr 
)
virtual

◆ Yell() [2/2]

void Unit::Yell ( uint32  textId,
WorldObject const *  target = nullptr 
)
virtual

Reimplemented in Player.

21060{
21061 Talk(textId, CHAT_MSG_MONSTER_YELL, sWorld->getFloatConfig(CONFIG_LISTEN_RANGE_YELL), target);
21062}

References CHAT_MSG_MONSTER_YELL, CONFIG_LISTEN_RANGE_YELL, and sWorld.

Member Data Documentation

◆ _charmThreatInfo

CharmThreatMap Unit::_charmThreatInfo
protected

Referenced by RemoveCharmedBy().

◆ _instantCast

bool Unit::_instantCast
protected

◆ _isWalkingBeforeCharm

bool Unit::_isWalkingBeforeCharm
private

Are we walking before we were charmed?

Referenced by SetCharm(), and Unit().

◆ _lastDamagedTargetGuid

◆ _lastExtraAttackSpell

uint32 Unit::_lastExtraAttackSpell
private

◆ _lastLiquid

LiquidTypeEntry const* Unit::_lastLiquid
protected

◆ _oldFactionId

uint32 Unit::_oldFactionId
private

faction before charm

Referenced by GetOldFactionId(), RemoveCharmedBy(), SetCharmedBy(), and Unit().

◆ _redirectThreatInfo

◆ _valuesUpdateCache

ValuesUpdateCache Unit::_valuesUpdateCache
private

◆ bRequestForcedVisibilityUpdate

◆ extraAttacksTargets

std::unordered_map<ObjectGuid , uint32 > Unit::extraAttacksTargets
private

Referenced by AddExtraAttacks(), and Update().

◆ i_AI

◆ i_disabledAI

UnitAI* Unit::i_disabledAI
protected

Referenced by UpdateCharmAI().

◆ i_motionMaster

MotionMaster* Unit::i_motionMaster
protected

◆ IsAIEnabled

◆ m_appliedAuras

◆ m_applyResilience

bool Unit::m_applyResilience
protected

◆ m_attackers

◆ m_attacking

Unit* Unit::m_attacking
protected

◆ m_attackTimer

◆ m_auraModifiersGroup

◆ m_auraStateAuras

◆ m_auraUpdateIterator

AuraMap::iterator Unit::m_auraUpdateIterator
protected

◆ m_AutoRepeatFirstCast

bool Unit::m_AutoRepeatFirstCast
protected

◆ m_baseSpellCritChance

◆ m_canDualWield

bool Unit::m_canDualWield

◆ m_canModifyStats

bool Unit::m_canModifyStats
protected

◆ m_charmInfo

◆ m_cleanupDone

bool Unit::m_cleanupDone
private

◆ m_CombatTimer

uint32 Unit::m_CombatTimer
private

◆ m_ComboPointHolders

std::unordered_set<Unit*> Unit::m_ComboPointHolders
private

◆ m_comboPoints

int8 Unit::m_comboPoints
private

◆ m_comboTarget

◆ m_Controlled

◆ m_ControlledByPlayer

bool Unit::m_ControlledByPlayer

◆ m_CreatedByPlayer

bool Unit::m_CreatedByPlayer

◆ m_createStats

float Unit::m_createStats[MAX_STATS]
protected

◆ m_currentSpells

◆ m_deathState

◆ m_delayed_unit_ai_notify_timer

uint16 Unit::m_delayed_unit_ai_notify_timer

Referenced by Unit(), and Update().

◆ m_delayed_unit_relocation_timer

uint16 Unit::m_delayed_unit_relocation_timer

Referenced by Unit(), Player::Update(), and Update().

◆ m_Diminishing

◆ m_duringRemoveFromWorld

bool Unit::m_duringRemoveFromWorld
private

◆ m_dynObj

◆ m_extraAttacks

uint32 Unit::m_extraAttacks

◆ m_FollowingRefMgr

FollowerRefMgr Unit::m_FollowingRefMgr
private

Referenced by addFollower().

◆ m_gameObj

◆ m_HostileRefMgr

HostileRefMgr Unit::m_HostileRefMgr
private

◆ m_interruptableAuras

◆ m_interruptMask

◆ m_last_notify_mstime

uint32 Unit::m_last_notify_mstime

Referenced by Unit().

◆ m_last_notify_position

◆ m_lastManaUse

uint32 Unit::m_lastManaUse
private

◆ m_lastSanctuaryTime

uint32 Unit::m_lastSanctuaryTime

◆ m_modAttackSpeedPct

◆ m_modAuras

◆ m_modMeleeHitChance

◆ m_modRangedHitChance

◆ m_modSpellHitChance

◆ m_movedByPlayer

◆ m_ObjectSlot

◆ m_ownedAuras

◆ m_petAuras

PetAuraSet Unit::m_petAuras

◆ m_procDeep

int32 Unit::m_procDeep
protected

Referenced by CanProc(), and SetCantProc().

◆ m_race

uint8 Unit::m_race
protected

◆ m_reactiveTimer

uint32 Unit::m_reactiveTimer[MAX_REACTIVE]
protected

◆ m_realRace

uint8 Unit::m_realRace
protected

◆ m_regenTimer

◆ m_removedAuras

AuraList Unit::m_removedAuras
protected

◆ m_removedAurasCount

uint32 Unit::m_removedAurasCount
protected

◆ m_rootTimes

uint32 Unit::m_rootTimes
protected

Referenced by SetRooted(), and Unit().

◆ m_scAuras

AuraList Unit::m_scAuras
protected

◆ m_sharedVision

◆ m_speed_rate

float Unit::m_speed_rate[MAX_MOVE_TYPE]
protected

◆ m_spellImmune

◆ m_state

uint32 Unit::m_state
private

◆ m_SummonSlot

◆ m_ThreatMgr

◆ m_threatModifier

float Unit::m_threatModifier[MAX_SPELL_SCHOOL]

◆ m_transform

uint32 Unit::m_transform
protected

Referenced by getTransForm(), setTransForm(), and Unit().

◆ m_unitTypeMask

◆ m_vehicle

◆ m_vehicleKit

Vehicle* Unit::m_vehicleKit
protected

◆ m_visibleAuras

◆ m_weaponDamage

◆ movespline

◆ NeedChangeAI

bool Unit::NeedChangeAI

◆ SafeUnitPointerSet

std::set<SafeUnitPointer*> Unit::SafeUnitPointerSet

The documentation for this class was generated from the following files: